C ++字符串替换不能按预期工作

时间:2012-06-14 15:38:55

标签: c++ string replace

关于C ++替换函数的小问题。我正在逐行解析每行文本输入。文本文件示例:

SF27_34KJ
EEE_30888
KPD324222
4230_333

我需要删除每一行的所有下划线并用逗号替换它。当我尝试这样的事情时:

  

mystring.replace(mystring.begin(),mystring.end(),'_',',');

在每一行 - 而不是“ SF27,34KJ ”我得到95x“”字符。可能有什么不对?

4 个答案:

答案 0 :(得分:6)

使用std::replace()

std::replace(mystring.begin(), mystring.end(), '_', ',');

答案 1 :(得分:1)

basic_string::replace没有按照您的想法行事。

basic_string::replace(it_a, it_e, ... )用您指定的内容替换it_ait_e之间的所有字符,而不仅仅是那些与之匹配的字符。

有一百种方法可以做你想要做的事情,但最简单的方法是使用std::replace中的<algorithm>,其中 做你做的事情想:

std::replace(mystring.begin(), mystring.end(), '_', ',');

另一种方法是将std::transformfunctor结合使用。这比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