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