#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. Кроме того, достаточно ли этих специальных символов, чтобы их можно было экранировать, или есть и другие, мне следует позаботиться о теме, цель этого — создать дамп базы данных в файле, чтобы я мог использовать его позже для восстановления базы данных.