Эквивалент версии addSlashes на основе Qt - PullRequest
0 голосов
/ 11 мая 2011

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

QString addSlashes(QString str) 

  {

    QString newStr;

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

        if(str[i] == '\0')
         {
           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 Ответ

0 голосов
/ 11 мая 2011

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

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

reps['\0'] = "\\\0";
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('\0');
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 символах). Когда вы приступаете к этому, карта / набор просто используется в качестве разреженного массива, но если вы используете его только в одном (или даже нескольких) местах, вы, несомненно, сэкономите больше места (в коде) за счет используя массив, чем вы сохраняете (в данных), используя set / map.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...