C++如何从多行字符串中移除换行符

76

如何最高效地从std::string中删除换行符?


12
换行符是否应该位于特定位置,比如字符串的末尾? - Greg Hewgill
不;它可以在任何地方。 - shergill
13个回答

0
关于从字符串代码中仅删除最后一个 \n 的答案 3:
if (!s.empty() && s[s.length()-1] == '\n') {
    s.erase(s.length()-1);
}

如果字符串真的为空,if条件不会失败吗?

这样做不是更好吗:

if (!s.empty())
{
    if (s[s.length()-1] == '\n')
        s.erase(s.length()-1);
}

1
不,第一个版本应该在字符串为空时中止if语句。 - underdoeg

0

如果在字符串中存在该字符,那么你无法做到比 O(n) 更好。

唯一的方法就是在字符串中搜索 '\n' 并将其删除。

for(int i=0;i<s.length();i++) if(s[i]=='\n') s.erase(s.begin()+i);

如果需要更多换行符:

int n=0;
for(int i=0;i<s.length();i++){
    if(s[i]=='\n'){
        n++;//we increase the number of newlines we have found so far
    }else{
        s[i-n]=s[i];
    }
}
s.resize(s.length()-n);//to delete only once the last n elements witch are now newlines

它会一次性删除所有的换行符。


1
这个实现无法正确处理连续的换行符,因为 i 会被递增,而不管元素是否被删除。 - Greg Hewgill

0

所有这些答案对我来说都有点繁重。

如果你只是直接删除 '\n' 并将其他所有内容向后移动一个位置,那么你可能会发现一些字符以奇怪的方式挤在一起。那么为什么不做简单(也是最有效)的事情:用空格替换所有的 '\n' 呢?

for (int i = 0; i < str.length();i++) {
   if (str[i] == '\n') {
      str[i] = ' ';
   }
}

可能有一些方法可以改善边缘的速度,但它比在内存中移动整个字符串块要快得多。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接