关于 C++ 替换函数的小问题。我正在逐行解析每一行文本输入。文本文件示例:
SF27_34KJ
EEE_30888
KPD324222
4230_333
我需要删除每一行上的所有下划线并用逗号替换它。当我尝试这样的事情时:
mystring.replace(mystring.begin(), mystring.end(), '_', ',');
在每一行 - 而不是“ SF27,34KJ ”,我得到 95x“ , ”char。有什么问题?
std::replace(mystring.begin(), mystring.end(), '_', ',');
basic_string::replace
不做你认为它做的事。
basic_string::replace(it_a, it_e, ... )
用您指定的任何字符替换所有字符,it_a
而it_e
不仅仅是那些匹配的字符。
有一百种方法可以做你想做的事,但最简单的可能是使用std::replace
from <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;
});
这并不是 replace 的工作原理。查看 api http://www.cplusplus.com/reference/string/string/replace/,您为开始和结束提供迭代器以及要复制的字符串,但另一个参数是该部分的最大长度.
要获得您想要的功能,请尝试查找子字符串并替换它(两次调用)。这里有详细说明:Replace part of a string with another string。