关于C ++替换函数的小问题。我正在逐行解析每行文本输入。文本文件示例:
SF27_34KJ
EEE_30888
KPD324222
4230_333
我需要删除每一行的所有下划线并用逗号替换它。当我尝试这样的事情时:
mystring.replace(mystring.begin(),mystring.end(),'_',',');
在每一行 - 而不是“ SF27,34KJ ”我得到95x“,”字符。可能有什么不对?
答案 0 :(得分:6)
std::replace(mystring.begin(), mystring.end(), '_', ',');
答案 1 :(得分:1)
basic_string::replace
没有按照您的想法行事。
basic_string::replace(it_a, it_e, ... )
用您指定的内容替换it_a
和it_e
之间的所有字符,而不仅仅是那些与之匹配的字符。
有一百种方法可以做你想要做的事情,但最简单的方法是使用std::replace
中的<algorithm>
,其中 做你做的事情想:
std::replace(mystring.begin(), mystring.end(), '_', ',');
另一种方法是将std::transform
与functor结合使用。这比std::replace
更有优势,因为你可以在一次传递中执行多次替换。
这是一个C ++ 03仿函数:
struct ReplChars
{
char operator()(char c) const
{
if( c == '_' )
return ',';
if( c == '*' )
return '.';
return c;
}
};
......以及它的使用:
std::transform(mystring.begin(), mystring.end(), mystring.begin(), ReplChars());
在C ++ 11中,这可以通过使用lambda而不是functor来减少:
std::transform(mystring.begin(), mystring.end(), mystring.begin(), [](char c)->char
{
if( c == '_' )
return ',';
if( c == '*' )
return '.';
return c;
});
答案 2 :(得分:0)
查看here,没有替换方法,它接受两个迭代器,然后是两个字符。考虑到'_'的ascii值是95,我猜你正在打这个:
string& replace ( iterator i1, iterator i2, size_t n2, char c );
所以不要用','替换'_'的所有实例,而是用95'替换begin()
到end()
的字符串。
有关如何替换字符串中的出现事项,请参阅here。
答案 3 :(得分:0)
这不是替换工作的确切方式。查看api http://www.cplusplus.com/reference/string/string/replace/,给出开头和结尾的迭代器以及要复制的字符串,但另一个参数是该部分的最大长度。
要获得您想要的功能,请尝试查找子字符串并替换它(两次调用)。这在此详述:Replace part of a string with another string。