C++;字符串替换不';I don’我没有按预期工作 关于C++替换函数的小问题。我正在逐行分析每一行文本输入。文本文件的示例: SF27_34KJ EEE_30888 KPD324222 4230_333

C++;字符串替换不';I don’我没有按预期工作 关于C++替换函数的小问题。我正在逐行分析每一行文本输入。文本文件的示例: SF27_34KJ EEE_30888 KPD324222 4230_333,c++,string,replace,C++,String,Replace,我需要删除每行上的所有下划线,并用逗号替换。当我尝试这样的事情时: replace(mystring.begin(),mystring.end(),“",”,“) 在每一行上-而不是“SF27,34KJ”我得到95x“,”字符。有什么问题吗?看,没有一种替换方法需要两个迭代器和两个字符。考虑到“u”的ascii值是95,我猜您会选择这个值: string& replace ( iterator i1, iterator i2, size_t n2, char c ); 因此,您不是将“

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

replace(mystring.begin(),mystring.end(),“",”,“)

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

看,没有一种替换方法需要两个迭代器和两个字符。考虑到“u”的ascii值是95,我猜您会选择这个值:

string& replace ( iterator i1, iterator i2, size_t n2, char c );
因此,您不是将“u”的所有实例替换为“,”,而是将
begin()
end()
的字符串替换为95“,”


有关如何替换字符串中的偶然事件,请参见。

这并不是替换的工作方式。检查api,您为起始和结束提供迭代器以及要复制的字符串,但另一个参数是该部分的最大长度

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

使用:


basic_string::replace
不会做您认为它会做的事情


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

有上百种方法可以完成您想要做的事情,但最简单的方法可能是使用
中的
std::replace
。这比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;
});

您将
std::replace
string混淆。replace
。简短解释:
std::replace
替换另一个字符串中出现的所有字符串,而
string::replace
只替换指定位置的子字符串。是的,您救了我一天!谢谢。
std::transform(mystring.begin(), mystring.end(), mystring.begin(), ReplChars());
std::transform(mystring.begin(), mystring.end(), mystring.begin(), [](char c)->char
{
    if( c == '_' )
        return ',';
    if( c == '*' )
        return '.';
    return c;
});