C++从多行字符串中删除新行

she*_*ill 51 c++ string multiline

什么是从std :: string中删除'换行符'的最有效方法?

luk*_*uke 108

#include <algorithm>
#include <string>

std::string str;

str.erase(std::remove(str.begin(), str.end(), '\n'), str.end());
Run Code Online (Sandbox Code Playgroud)

std :: remove的行为可能不是你所期望的.在这里查看它的解释.

  • 如果有其他平台换行的可能性,也可以删除'\ r'字符.第二次调用erase和std :: remove等在性能方面没什么大不了的.替代方法,例如将std :: remove_if与谓词函数一起使用,可能会更慢. (5认同)
  • 最后一行的最后一个参数可以是`cend()`,例如`str.erase(std::remove(str.begin(), str.end(), '\n'), str.cend());` (2认同)

Gre*_*ill 9

如果预期换行符位于字符串的末尾,则:

if (!s.empty() && s[s.length()-1] == '\n') {
    s.erase(s.length()-1);
}
Run Code Online (Sandbox Code Playgroud)

如果字符串可以在字符串中的任何位置包含许多换行符:

std::string::size_type i = 0;
while (i < s.length()) {
    i = s.find('\n', i);
    if (i == std::string:npos) {
        break;
    }
    s.erase(i);
}
Run Code Online (Sandbox Code Playgroud)

  • 第一版完美.第二个版本更容易使用std :: erase(std :: removr(XXX)) (3认同)

cop*_*pro 7

您应该使用erase-remove惯用法,寻找'\n'.这适用于任何标准序列容器; 不只是string.


edW*_*edW 5

这是 DOS 或 Unix 换行符之一:

    void chomp( string &s)
    {
            int pos;
            if((pos=s.find('\n')) != string::npos)
                    s.erase(pos);
    }
Run Code Online (Sandbox Code Playgroud)

  • 将 `if` 改为 `while` 循环,你就有了一个很好的解决方案。 (5认同)