我有一个带有嵌入式string
字符的c ++ '\0'
。
我有一个函数replaceAll()
,该函数应该用另一个模式替换所有出现的模式。对于“普通”字符串,它可以正常工作。但是,当我尝试找到'\0'
字符时,我的功能不起作用,我也不知道为什么。 replaceAll
在string::find()
上似乎失败了,这对我来说没有意义。
// Replaces all occurrences of the text 'from' to the text 'to' in the specified input string.
// replaceAll("Foo123Foo", "Foo", "Bar"); // Bar123Bar
string replaceAll( string in, string from, string to )
{
string tmp = in;
if ( from.empty())
{
return in;
}
size_t start_pos = 0;
// tmp.find() fails to match on "\0"
while (( start_pos = tmp.find( from, start_pos )) != std::string::npos )
{
tmp.replace( start_pos, from.length(), to );
start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx'
}
return tmp;
}
int main(int argc, char* argv[])
{
string stringWithNull = { '\0', '1', '\0', '2' };
printf("size=[%d] data=[%s]\n", stringWithNull.size(), stringWithNull.c_str());
// This doesn't work in the special case of a null character and I don't know why
string replaced = replaceAll(stringWithNull, "\0", "");
printf("size=[%d] data=[%s]\n", replaced.size(), replaced.c_str());
}
输出:
size=[4] data=[]
size=[4] data=[]
答案 0 :(得分:5)
在您的情况下不起作用的原因是std::string
中的const char*
构造函数没有大小,它将读取所有元素,但不包括以n结尾的char。结果,
replaceAll(stringWithNull, "\0", "");
在replaceAll
设置为空字符串(from
)的情况下调用replaceAll( string in, string from, string to )
,返回未修改的in
。
要解决此问题,请使用具有大小的构造函数,或者使用列表初始化进行初始化,例如,对原始字符串进行处理的方式相同,例如:
replaceAll(stringWithNull, {'\0'}, "");
答案 1 :(得分:1)
这样做的时候
replaceAll(stringWithNull, "\0", "");
"\0"
与""
相同,因为从c字符串构造时,std::string
的构造函数在空字符处停止。这意味着您正在搜索什么,什么也没有替换。您需要的是
string replaced = replaceAll(stringWithNull, {'\0'}, "");
实际上是用空字符填充from
。