【问题标题】:Qt based addSlashes version equivalent基于 Qt 的 addSlashes 版本等效
【发布时间】:2011-08-22 22:14:39
【问题描述】:

我刚刚写了一个基于 Qt 的 php addSlashes 函数,我不会看到任何改进,建议它。我打算用这个函数来填充一个包含数百个insert查询的文件,更具体地说,我将创建php database dumplike。

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;
}

【问题讨论】:

    标签: c++ qt qt4 qstring addslashes


    【解决方案1】:

    我想我会将数据与代码分开,例如:

    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&lt;bool&gt; 之类的字符。我们谈论的是 32 字节的存储空间(假设您只关心 256 个字符)。当你开始使用它时,地图/集只是被用作一个稀疏数组,但如果你只在一个(甚至几个)地方使用它,你无疑会节省更多空间(在代码中)使用数组而不是使用 set/map 保存(在数据中)。

    【讨论】:

    • 我在这里谈论的是基于 Qt 的解决方案。另外,这些特殊字符是否足以被转义或者还有其他我应该关心的主题,这样做的目的是将数据库转储到文件中,以便以后可以使用它来恢复数据库。
    猜你喜欢
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 2020-06-07
    • 2020-03-18
    • 1970-01-01
    • 2012-02-14
    • 2014-03-24
    • 1970-01-01
    相关资源
    最近更新 更多