从std :: string中删除'换行符'的最有效方法是什么?
答案 0 :(得分:101)
#include <algorithm>
#include <string>
std::string str;
str.erase(std::remove(str.begin(), str.end(), '\n'), str.end());
std :: remove的行为可能不是你所期望的。请参阅here的解释。
答案 1 :(得分:9)
如果预计换行符位于字符串的末尾,则:
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);
}
答案 2 :(得分:7)
您应该使用erase-remove idiom,寻找'\n'
。这适用于任何标准序列容器;不只是string
。
答案 3 :(得分:4)
这是一个DOS或Unix新行:
void chomp( string &s)
{
int pos;
if((pos=s.find('\n')) != string::npos)
s.erase(pos);
}
答案 4 :(得分:1)
s.erase(std::remove(s.begin(), s.end(), '\n'), s.end());
答案 5 :(得分: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);
答案 6 :(得分: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
答案 7 :(得分: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
它会删除所有换行符。
答案 8 :(得分:0)
使用std :: algorithms。这个问题有一些适当的可重复使用的建议Remove spaces from std::string in C++
答案 9 :(得分:0)
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 );
答案 10 :(得分:0)
关于答案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);
}
答案 11 :(得分:-1)
所有这些答案对我来说似乎有点沉重。
如果你只是拿出'\ n'并将其他所有内容移回一个位置,你可能会以一种奇怪的方式将一些角色撞在一起。那么为什么不做简单(也是最有效)的事情:用空格替换所有'\ n'?
for (int i = 0; i < str.length();i++) {
if (str[i] == '\n') {
str[i] = ' ';
}
}
可能有一些方法可以提高边缘的速度,但它会比在内存中移动整个字符串块更快。