删除字符串中嵌入的空字符
Remove null character embedded in string
我有一个带有嵌入 '[=13=]'
字符的 c++ string
。
我有一个函数 replaceAll()
,它 应该 用另一个模式替换所有出现的模式。对于 "normal" 字符串,它工作正常。但是,当我尝试查找 '[=13=]'
字符时,我的函数不起作用,我也不知道为什么。 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 "[=10=]"
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 = { '[=10=]', '1', '[=10=]', '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, "[=10=]", "");
printf("size=[%d] data=[%s]\n", replaced.size(), replaced.c_str());
}
输出:
size=[4] data=[]
size=[4] data=[]
它在您的情况下不起作用的原因是 const char*
中没有大小的 std::string
构造函数将读取所有元素,但不包括 nul 终止字符。结果,
replaceAll(stringWithNull, "[=10=]", "");
调用 replaceAll
并将 from
设置为空字符串 (replaceAll( string in, string from, string to )
),returns in
未修改。
为了解决这个问题,使用一个带大小的构造函数,或者用列表初始化来初始化,就像你为你的原始字符串做的一样,例如:
replaceAll(stringWithNull, {'[=11=]'}, "");
当你做的时候
replaceAll(stringWithNull, "[=10=]", "");
"[=12=]"
与 ""
相同,因为 std::string
的构造函数在从 C 字符串构造时停在空字符处。这意味着您什么都不搜索,什么也不替换。你需要的是
string replaced = replaceAll(stringWithNull, {'[=11=]'}, "");
实际 from
填充空字符。
我有一个带有嵌入 '[=13=]'
字符的 c++ string
。
我有一个函数 replaceAll()
,它 应该 用另一个模式替换所有出现的模式。对于 "normal" 字符串,它工作正常。但是,当我尝试查找 '[=13=]'
字符时,我的函数不起作用,我也不知道为什么。 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 "[=10=]"
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 = { '[=10=]', '1', '[=10=]', '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, "[=10=]", "");
printf("size=[%d] data=[%s]\n", replaced.size(), replaced.c_str());
}
输出:
size=[4] data=[]
size=[4] data=[]
它在您的情况下不起作用的原因是 const char*
中没有大小的 std::string
构造函数将读取所有元素,但不包括 nul 终止字符。结果,
replaceAll(stringWithNull, "[=10=]", "");
调用 replaceAll
并将 from
设置为空字符串 (replaceAll( string in, string from, string to )
),returns in
未修改。
为了解决这个问题,使用一个带大小的构造函数,或者用列表初始化来初始化,就像你为你的原始字符串做的一样,例如:
replaceAll(stringWithNull, {'[=11=]'}, "");
当你做的时候
replaceAll(stringWithNull, "[=10=]", "");
"[=12=]"
与 ""
相同,因为 std::string
的构造函数在从 C 字符串构造时停在空字符处。这意味着您什么都不搜索,什么也不替换。你需要的是
string replaced = replaceAll(stringWithNull, {'[=11=]'}, "");
实际 from
填充空字符。