65

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

4

12 回答 12

135
#include <algorithm>
#include <string>

std::string str;

str.erase(std::remove(str.begin(), str.end(), '\n'), str.end());

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

于 2009-09-28T19:09:42.313 回答
11

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

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

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

std::string::size_type i = 0;
while (i < s.length()) {
    i = s.find('\n', i);
    if (i == std::string:npos) {
        break;
    }
    s.erase(i);
}
于 2009-09-28T19:06:24.203 回答
7

您应该使用擦除删除习语,寻找'\n'. 这适用于任何标准序列容器;不只是string

于 2009-09-28T19:06:37.150 回答
5

这是 DOS 或 Unix 换行符:

    void chomp( string &s)
    {
            int pos;
            if((pos=s.find('\n')) != string::npos)
                    s.erase(pos);
    }
于 2012-11-09T17:36:27.887 回答
1

使用 std::算法。这个问题有一些适当的可重用建议从 C++ 中的 std::string 中删除空格

于 2009-09-28T19:08:26.653 回答
1
s.erase(std::remove(s.begin(), s.end(), '\n'), s.end());
于 2009-09-28T19:08:31.850 回答
1

该代码从字符串中删除所有换行符str

O(N) 实施最好在没有对 SO评论和生产中的评论的情况下使用。

unsigned shift=0;
for (unsigned i=0; i<length(str); ++i){
    if (str[i] == '\n') {
        ++shift;
    }else{
        str[i-shift] = str[i];
    }
}
str.resize(str.length() - shift);
于 2009-09-28T19:09:26.490 回答
1
 std::string some_str = SOME_VAL;
 if ( some_str.size() > 0 && some_str[some_str.length()-1] == '\n' ) 
  some_str.resize( some_str.length()-1 );

或(在末尾删除几个换行符)

some_str.resize( some_str.find_last_not_of(L"\n")+1 );
于 2009-09-28T19:10:01.067 回答
1

在 for 循环中执行此操作的另一种方法

void rm_nl(string &s) {
    for (int p = s.find("\n"); p != (int) string::npos; p = s.find("\n"))
    s.erase(p,1);
}

用法:

string data = "\naaa\nbbb\nccc\nddd\n";
rm_nl(data); 
cout << data; // data = aaabbbcccddd
于 2016-01-08T23:20:13.077 回答
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

它会擦除所有换行符一次。

于 2009-09-28T19:06:05.207 回答
0

关于答案 3 仅删除最后一个 \n 关闭字符串代码:

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);
}
于 2016-06-06T09:28:09.467 回答
-1

所有这些答案对我来说似乎有点沉重。

如果您只是完全删除 '\n' 并将其他所有内容移回一个位置,那么您很可能会以一种看起来很奇怪的方式将一些字符撞在一起。那么为什么不做简单(也是最有效)的事情:用空格替换所有'\n'?

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

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

于 2009-09-28T19:15:24.370 回答