3

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

SF27_34KJ
EEE_30888
KPD324222
4230_333

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

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

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

4

4 回答 4

6

使用std::replace()

std::replace(mystring.begin(), mystring.end(), '_', ',');
于 2012-06-14T15:44:42.130 回答
1

basic_string::replace不做你认为它做的事。

basic_string::replace(it_a, it_e, ... )用您指定的任何字符替换所有字符,it_ait_e不仅仅是那些匹配的字符。

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

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

另一种方法是与仿函数std::transform一起使用。这有一个优势,因为您可以在一次通过中执行多个替换。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;
});
于 2012-06-14T15:48:01.807 回答
0

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

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

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

请参阅此处了解如何替换字符串中的出现。

于 2012-06-14T15:43:32.060 回答
0

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

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

于 2012-06-14T15:44:16.023 回答