0
#include <iostream>
#include <string>

using namespace std;

int main(){

    string previous;
    string current;

    while (cin>>current)
    {
         if(current == previous)
         {
              cout<< "repeated word: " << previous;
         }
         previous=current;

    }
    return 0;
}

所以我输入了一个句子“blah blah foo bar”,但它在blah之后停止,if不满足并且previous被设置为等于current。为什么这不只是用两个变量 = 来阻止它?它怎么知道分析空格之后的下一个单词?

4

2 回答 2

3

你的问题很难理解,但我想我知道你为什么感到困惑。您的困惑来自代码没有正确缩进的事实。您假设这return 0;是 while 循环的一部分,而实际上并非如此。正确缩进:

#include <iostream>
#include <string>

using namespace std;

int main(){

  string previous;
  string current;

  while (cin >> current)
  {
    if(current == previous)
    {
      cout<< "repeated word: " << previous;
    }
    previous=current;
  }
  return 0;
}

这清楚地说明了为什么 while 不会停止。

编辑:您应该阅读像这样的 C++ 流的介绍。(我不知道它是否有好处,但它应该对你有帮助)。

简而言之,如果您从标准流中读取变量,它会解析所有内容,直到第一个空格。如果成功,则流评估为true。在下一次读取时,它会丢弃所有空白,然后再次读取直到下一个空白。当没有更多内容可读取时,流将评估为false,从而终止循环。

于 2013-08-19T09:12:26.730 回答
0

operator>>首先丢弃前导空白字符。然后它开始读取输入,直到发生错误或遇到另一个空白字符。如果读取成功,结果将存储在右侧操作数中。返回对左侧操作数的引用。

因为cin >> current在while循环的条件中使用,所以需要转换为bool. 这是通过流的operator bool功能完成的。如果流中设置了任何错误标志,则计算结果为false,否则为true

一个例子来说明(-意味着丢弃,^意味着读取,*意味着停止):

                 "    foo    foo   bar   "
1. iteration     -----^^^*
2. iteration             ----^^^*
3. iteration                    ---^^^*
4. iteration                          ---* no input left, loop breaks

如果您想在遇到第一个重复项时停止循环,则需要明确地执行此操作(如何执行此操作留作练习)。

于 2013-08-19T09:19:59.240 回答