Эквивалент версии addSlashes на основе Qt

#c #qt #qt4 #qstring #addslashes

#c #qt #qt4 #qstring #addslashes

Вопрос:

Я только что написал функцию addSlashes на php на основе Qt, подобную, я не буду видеть никаких улучшений, предложений к ней. Я планирую использовать эту функцию для заполнения файла сотней insert запросов, если быть более конкретным, я собираюсь создать дамп базы данных php, подобный.

 QString addSlashes(QString str) 

  {

    QString newStr;

    for(int i=0;i<str.length();i  )
     {

        if(str[i] == '')
         {
           newStr.append('\');
           newStr.append('0');
         }
        else if(str[i] == ''')
         {
            newStr.append(''');
         }
        else if(str[i] == '"')
         {
            newStr.append('"');
         }
        else if(str[i] == '\')
         {
            newStr.append('\');
         }
        else
           newStr.append(str[i]);

     }
    return newStr;
}
  

Ответ №1:

Я думаю, я бы отделил данные от кода, что-то вроде:

 std::map<char, std::string> reps;

reps[''] = "\";
reps['''] = "\'";
reps['"'] = "\"";
reps['\'] = "\\";

for (int i=0; i<str.length(); i  )
    if ((pos=reps.find(str[i])!=reps.end())
        newStr.append(pos->second);
    else
        newStr.append(str[i]);
  

Вы, конечно, можете предпочесть использовать QMap вместо std::map хотя. Это изменит то, как вы пишете несколько вещей, но не меняет основной идеи.

В качестве альтернативы, поскольку каждый «специальный» вывод представляет собой просто исходный символ, которому предшествует обратная косая черта, вы могли бы просто использовать std::set символы, которым требуется обратная косая черта:

 std::set<char> needs_slash;

needs_slash.insert(''');
needs_slash.insert('"');
needs_slash.insert('');
needs_slash.insert('\');

for (int i=0; i<str.length(); i  ) {
    if (needs_slash.find(str[i]) != needs_slash.end())
        newStr.append('\');
    newStr.append(str[i]);
}
  

Учитывая небольшое количество задействованных символов, вы также могли бы использовать что-то вроде std::bitset или std::vector<bool> . Мы говорим о 32 байтах памяти (предполагая, что вам нужны только 256 символов). Когда вы приступаете к делу, карта / набор используется просто как разреженный массив, но если вы используете его только в одном (или даже нескольких) местах, вы, несомненно, сэкономите больше места (в коде), используя массив, чем вы экономите (в данных), используя набор / карту.

Комментарии:

1. Я здесь говорю о решении на основе Qt. Кроме того, достаточно ли этих специальных символов, чтобы их можно было экранировать, или есть и другие, мне следует позаботиться о теме, цель этого — создать дамп базы данных в файле, чтобы я мог использовать его позже для восстановления базы данных.