基于Qt的addSlashes版本等效

时间:2011-05-11 01:21:46

标签: c++ qt qt4 qstring addslashes

我刚刚写了一个基于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;
}

1 个答案:

答案 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::bitsetstd::vector<bool>的内容。我们谈论的是32字节的存储空间(假设你只关心256个字符)。当你开始使用它时,map / set只是用作稀疏数组,但如果你只在一个(甚至几个)位置使用它,你无疑会节省更多空间(在代码中)使用数组而不是使用set / map保存(在数据中)。