7

文字列を二重改行 ( ) で分割しようとしています"\n\n"

input_string = "firstline\nsecondline\n\nthirdline\nfourthline";

size_t current;
size_t next = std::string::npos;
do {
  current = next + 1;
  next = input_string.find_first_of("\n\n", current);
  cout << "[" << input_string.substr(current, next - current) << "]" << endl;
} while (next != std::string::npos);

私に出力を与える

[firstline]
[secondline]
[]
[thirdline]
[fourthline]

これは明らかに私が望んでいたものではありません。私は次のようなものを取得する必要があります

[first line
second line]
[third line
fourthline]

私も試しboost::splitましたが、同じ結果が得られます。私は何が欠けていますか?

4

3 に答える 3

5

find_first_of単一の文字のみを検索します。を渡すことによって何をするように指示しているのか 、または"\n\n"の最初のものを見つけることです。これは冗長です。代わりに使用してください。'\n''\n'string::find

boost::splitは、一度に 1 文字だけを調べることによっても機能します。

于 2012-07-07T08:29:19.800 に答える
1

このアプローチはどうですか:

  string input_string = "firstline\nsecondline\n\nthirdline\nfourthline";

  size_t current = 0;
  size_t next = std::string::npos;
  do
  {
    next = input_string.find("\n\n", current);
    cout << "[" << input_string.substr(current, next - current) << "]" << endl;
    current = next + 2;
  } while (next != std::string::npos);

それは私に与えます:

[firstline
secondline]
[thirdline
fourthline]

結果として、これは基本的にあなたが望んでいたものですよね?

于 2012-08-08T12:05:14.143 に答える
-2

コードが機能しない理由は、@Benjamin の回答で非常によく説明されています。そこで、代替ソリューションを紹介します。

手動で分割する必要はありません。あなたの特定のケースでstd::stringstreamは、適切です:

#include <iostream>
#include <sstream>

int main() {
        std::string input = "firstline\nsecondline\n\nthirdline\nfourthline";
        std::stringstream ss(input);
        std::string line;
        while(std::getline(ss, line))
        {
           if( line != "")
                 std::cout << line << std::endl;
        }
        return 0;
}

出力 (デモ):

firstline
secondline
thirdline
fourthline
于 2012-07-07T08:32:18.783 に答える