web-dev-qa-db-ja.com

C ++複数行の文字列から新しい行を削除

Std :: stringから「改行」を削除する最も効率的な方法は何ですか?

49
shergill
#include <algorithm>
#include <string>

std::string str;

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

Std :: removeの動作は、期待したものとは異なる場合があります。その説明を参照してください こちら

104
luke

改行が文字列の最後にあると予想される場合:

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);
}
9
Greg Hewgill

erase-remove idiom を使用して、'\n'。これは、標準のシーケンスコンテナで機能します。 stringだけではありません。

7
coppro

DOSまたはUnixの新しい行の1つを次に示します。

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

このコードは、文字列strからall改行を削除します。

O(N)実装は、SOおよびwithの実稼働時のコメントに対するコメントなしで提供するのが最適です。

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);
1
P Shved

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
1
mkungla

回答3について、最後の\ n off文字列コードのみを削除する場合:

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

文字列のどこよりも、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

すべての改行を一度消去します。

0
csiz

Std :: algorithmsを使用します。この質問には、適切に再利用可能ないくつかの提案があります C++のstd :: stringからスペースを削除します

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