2011-05-11 67 views
0

我刚刚写了一个基于Qt的php addSlashes函数,我不会看到任何改进,对它的建议。我打算用这个函数来填充一个文件,用百位查询insert,具体来说,我打算制作php database dump之类的。基于Qt的addSlashes版本等效

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

我想我会的数据从代码中分离出来,是这样的:

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保存(在数据中)。

+0

我在这里讨论基于Qt的解决方案。另外,那些特殊的charcarter是否足够被转义或者还有其他的我应该关心主题,其目标是将数据库转储到文件中,以便稍后可以使用它来恢复数据库。 – SIFE 2011-05-12 22:35:24