此代码段中的while循环如何工作?

时间:2018-07-12 15:26:40

标签: c++

这是我在一本书中找到的代码片段:

#include <iostream>
int main()
{
    // currVal is the number we're counting; we'll read new values into val
int currVal = 0, val = 0;
// read first number and ensure that we have data to process
if (std::cin >> currVal) {
    int cnt = 1;  // store the count for the current value we're processing
    while (std::cin >> val) { // read the remaining numbers
        if (val == currVal)   // if the values are the same
            ++cnt;            // add 1 to cnt
        else { // otherwise, print the count for the previous value
            std::cout << currVal << " occurs "
                      << cnt << " times" << std::endl;
            currVal = val;    // remember the new value
            cnt = 1;          // reset the counter
        }
    }  // while loop ends here
    // remember to print the count for the last value in the file
    std::cout << currVal <<  " occurs "
              << cnt << " times" << std::endl;
} // outermost if statement ends here
return 0;
}

此代码段计算将一个数字输入到输入流中的次数,并使用while循环接收和未知数量的数字。

但是,问题是,当我输入不同的数字而不是一个重复输入时。 (然后输入Ctrl + D,表示文件结束)。在显示最后一个值的次数之前,输入流似乎需要额外输入。

例如,如果我输入

  

1 2 3 4

以空格分隔,最后按Ctrl + D指示文件结尾,输出将为:

1 occurs 1 times
2 occurs 1 times
3 occurs 1 times 
<requests for input>
4 occurs 1 times

但是如果我在流中输入了不是整数的内容

  

1 2 3 4a

输出正常运行。

这是为什么?

1 个答案:

答案 0 :(得分:3)

while (std::cin >> val)将循环播放,直到cin进入不再有效的状态为止。使用Ctrl + D发送EOF字符,该字符将导致eof的{​​{1}}标志被设置并使其评估为cin,从而结束循环。

false的输入基本上执行相同的操作。当1 2 3 4a需要一个数字时,如果输入字母,则会导致输入设置cin的{​​{1}}标志失败。这也会导致fail的求值为cin并结束循环。


解决所有这些问题的一种方法是使用cin并一次获取所有输入。然后,您可以将false加载到std::string中,并从中获取单个元素。

std::string