我刚刚写了一个基于Qt的php addSlashes函数,我不会看到任何改进,建议。我计划使用此函数来填充带有数百个insert
查询的文件,更具体地说,我将创建php database dump之类的。
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;
}
答案 0 :(得分:0)
我想我会将数据与代码分开,例如:
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个字符)。当你开始使用它时,map / set只是用作稀疏数组,但如果你只在一个(甚至几个)位置使用它,你无疑会节省更多空间(在代码中)使用数组而不是使用set / map保存(在数据中)。