【问题标题】:C++ string replace doesn't work as expectedC++ 字符串替换不能按预期工作
【发布时间】:2012-06-17 16:37:38
【问题描述】:

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

SF27_34KJ
EEE_30888
KPD324222
4230_333

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

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

在每一行 - 而不是 "SF27,34KJ" 我得到 95x "," 字符。有什么问题?

【问题讨论】:

  • 您将std::replace 与string.replace 混淆了。
  • 简短解释:std::replace 替换字符串中所有出现的字符串,而 string::replace 仅替换指定位置的子字符串。

标签: c++ string replace


【解决方案1】:

使用std::replace():

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

【讨论】:

  • 是的,你拯救了我的一天!非常感谢。
【解决方案2】:

basic_string::replace 并没有按照你的想法去做。

basic_string::replace(it_a, it_e, ... ) 将it_a 和it_e 之间的所有字符替换为您指定的任何字符,而不仅仅是匹配的字符。

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

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 而不是仿函数来减少:

std::transform(mystring.begin(), mystring.end(), mystring.begin(), [](char c)->char
{
    if( c == '_' )
        return ',';
    if( c == '*' )
        return '.';
    return c;
});

【讨论】:

    【解决方案3】:

    查看here,没有替换方法需要两个迭代器和两个字符。考虑到 '_' 的 ascii 值是 95,我猜你正在打这个:

    string& replace ( iterator i1, iterator i2, size_t n2, char c );
    

    因此,不是用 ',' 替换所有 '_' 实例,而是用 95 ','s 替换从 begin() 到 end() 的字符串。

    请参阅here,了解如何替换字符串中的出现次数。

    【讨论】:

      【解决方案4】:

      这并不是 replace 的工作原理。查看 api http://www.cplusplus.com/reference/string/string/replace/,您为开始和结束提供迭代器以及要复制的字符串,但另一个参数是该部分的最大长度。

      要获得您想要的功能,请尝试查找子字符串并替换它(两次调用)。这里有详细说明:Replace part of a string with another string。

      【讨论】:

        猜你喜欢
        • 2015-02-22
        • 2012-10-31
        • 2019-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-17
        相关资源
        最近更新 更多