6

可能重复:
用于计算字符串中所有单词的 C++ 函数

所以我有一行单词,我使用 C++ 存储在一个字符串中。即“有一个农民叫比利\n”

我想知道字符串中的单词数(即当前有 6 个单词)。谁能告诉我该怎么做?如果这是不可能的,有没有办法可以计算字符串中的空格数(即“”)。让我知道谢谢!

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. 阅读 astd::string会在跳过前导空格后读取一个单词,其中单词是一系列非空白字符。
  2. std::istream_iterator<T>T通过读取相应的对象直到读取失败,将输入流变成一系列对象。
  3. std::istringstream接受 astd::string并将其转换为正在读取的流。
  4. std::istream_iterator<T>is的构造函数参数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() 将在其默认设置中跳过空格,这意味着它将为您提供由一个或多个空格分隔的每个“单词”。所以即使单词被多个空格分隔,上面的代码也会给你相同的结果。

于 2012-10-13T18:08:23.683 回答