【发布时间】:2015-12-11 10:20:55
【问题描述】:
我需要为以下字符构建自己的清理功能:
', ", \, \n, \r, \0 and CTRL-Z
我想确保以下代码可以解决问题且没有副作用:
#include <iostream>
#include <string>
#include <memory>
#include <sstream>
#include <iomanip>
#include <algorithm>
void sanitize (std::string &stringValue)
{
stringValue.replace(stringValue.begin(), stringValue.end(), "\\", "\\\\");
stringValue.replace(stringValue.begin(), stringValue.end(), "'", "\\'");
stringValue.replace(stringValue.begin(), stringValue.end(), "\"", "\\\"");
stringValue.replace(stringValue.begin(), stringValue.end(), "\n", "");
stringValue.replace(stringValue.begin(), stringValue.end(), "\r", "");
stringValue.replace(stringValue.begin(), stringValue.end(), "\0", "");
stringValue.replace(stringValue.begin(), stringValue.end(), "\x1A", "");
}
int main()
{
std::string stringValue = "This is a test string with 'special //characters\n";
std::cout << stringValue << std::endl;
sanitize(stringValue);
std::cout << stringValue << std::endl;
}
此代码不起作用。错误:
terminate called after throwing an instance of 'std::length_error'
what(): basic_string::_M_replace
1
1 This is a test string with 'special //characters
原码here
【问题讨论】:
-
当然,反斜杠应该是第一个被替换的……然后是其他的。已更正。
-
是的,它没有比第一步更进一步......看到参数正在使用错误的字符串长度来替换。
-
您能否解释一下,您认为是针对哪个
std::basic_string::replace函数签名?