C ++从多行string中删除新行

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

#include <algorithm> #include <string> std::string str; str.erase(std::remove(str.begin(), str.end(), '\n'), str.end()); 

std :: remove的行为可能不完全是你所期望的。 在这里看到一个解释。

你应该使用erase-remove成语 ,寻找'\n' 。 这将适用于任何标准的顺序容器; 不只是string

如果换行符预期在string的末尾,那么:

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

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

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

这里是一个DOS或Unix新行:

  void chomp( string &s) { int pos; if((pos=s.find('\n')) != string::npos) s.erase(pos); } 
 s.erase(std::remove(s.begin(), s.end(), '\n'), s.end()); 

该代码从stringstr删除所有换行符。

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); 

在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 

使用std :: algorithms。 这个问题有一些适当的可重用的build议在C ++中删除std :: string的空格

  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 ); 

如果它在string中的任何地方比你不能做得更好O(n)。

唯一的方法是在string中search'\ 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[in]=s[i]; } } s.resize(s.length()-n);//to delete only once the last n elements witch are now newlines 

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

关于答案3只删除最后\ n offstring代码:

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

if条件不会失败,如果string真的是空的?

是不是更好:

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

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

如果你只是把“\ n”删除,然后把其他所有的东西都移回去,那么你很可能会以一种奇怪的方式将一些人物砸在一起。 那么为什么不做简单的(也是最有效率的)呢:用空格replace所有的'\ n'?

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

可能有办法来提高边缘的速度,但比在内存中移动整个string更快。