6

重複の可能性:
文字列内のすべての単語をカウントするC++関数

したがって、C++を使用して文字列に格納した単語の行があります。すなわち「ビリーという名前の農夫がいました\n」

文字列内の単語数を知りたい(つまり、現在6つの単語が含まれている)。誰かがこれを行う方法を教えてもらえますか?これが不可能な場合は、文字列内のスペースの数を数える方法があります(つまり、 "")。THanksを教えてください!

4

2 に答える 2

9

確かに、それは簡単です:

std::cout << "number of words: "
          << std::distance(std::istream_iterator<std::string>(
                               std::istringstream(str) >> std::ws),
                           std::istream_iterator<std::string>()) << '\n';

ちょっとした説明のために:

  1. 読み取りは、単語が非空白文字のシーケンスであるstd::string場合、先頭の空白をスキップした後に単語を読み取ります。
  2. std::istream_iterator<T>T読み取りが失敗するまで対応するオブジェクトを読み取ることにより、入力ストリームを一連のオブジェクトに変換します。
  3. std::istringstreamを取り、std::stringそれを読み取り元のストリームに変換します。
  4. へのコンストラクタ引数std::istream_iterator<T>は ですstd::istream&。つまり、テンポラリstd::istringstreamを直接使用することはできませんが、参照を取得する必要があります。std::wsこれは、先頭の空白もスキップする唯一の興味深い効果です。
  5. std::distance()シーケンス内の要素の数を決定します (最初に使用されstd::count()た値は、特定の条件に一致するシーケンス内の要素の数を決定しますが、条件は実際には欠落していました)。
于 2012-10-13T18:09:43.043 に答える
8

単語を数える簡単な方法は、次のように std::string で >> 演算子を使用することです。

std::stringstream is("There was a farmer named Billy");
std::string word;

int number_of_words = 0;
while (is >> word)
  number_of_words++;

std::istream から std::string を抽出する場合、 >>operator() はデフォルト設定で空白をスキップします。つまり、1 つ以上のスペースで区切られた各「単語」が得られます。したがって、上記のコードでは、単語が複数のスペースで区切られていても同じ結果が得られます。

于 2012-10-13T18:08:23.683 に答える