在论坛上看到这么一个题
设置常量int Max = 1, 程序执行时输入2a 按下enter此时屏幕显示平均值,请问这个时候a在输入缓冲区嘛?缓冲区是a和\n?
我们一开始输入2有道输入缓冲区 接着输入a这时是关闭输入流?既然关闭了 为什么后面还能够输入enter('\n')?
并且while循环里的cout << "Please enter a number: ";没有执行到,a又不是int不就符合循环条件么。。
#include <iostream>
const int Max = 1;
using namespace std;
int main()
{
int golf[Max];
cout << " Please entr your golf scores.\n";
cout << "You must enter " << Max << "rounds.\n";
int i;
for (i = 0;i < Max; i++)
{
cout << "round #" << i+1 << ": ";
while (!(cin >> golf[i]))
{
cout << "Please enter a number: ";
}
}
double total = 0.0;
for (i = 0; i < Max; i++)
total += golf[i];
cout << total / Max << "average score " << Max << "Rounds\n";
system("pause");
return 0;
}
这个题目来自:http://bbs.youkuaiyun.com/topics/390884942
首先来讲,这个程序有个很大的错误,就是while(!(cin >> golf[i]))这句话,只要用户输入的第一个字符不是数字,那么cin >> golf[i] 就会错误,就是说cin会进入错误状态,检查cin.fail()将会成功,cin不再有效,从而进入死循环。
当输入2a的时候,a在缓冲区吗?缓冲区是a和‘\n’吗?回答是肯定的。2a和'\n'都在缓冲区,并且长度是3。如果有兴趣,可以自己调试进去看。这里我讲一个简单的方法来验证。我们在cout << total / Max << "average score " << Max << "Rounds\n";这句代码之后加入以下代码
char a;
cin >> a;
cout << a << endl;
编译运行,输入2a回车,结果如下:
注意,最后面的cin >> a; 程序并没有要求我敲打键盘输入字符,而是直接输出了结果a,这就说明a已经在缓冲区了,那么'\n'有没有在缓冲区呢?回忆一下,我们在cin >> a; 这样的程序,如果只敲打一行字符,而不打回车,会返回吗?不会,system("pause");将不会被执行。这里,我们只在一开始输入2a和回车,就能够打印出”请按任意键继续...",就足以说明‘\n’也在缓冲区中。
下一个问题“我们一开始输入2有道输入缓冲区 接着输入a这时是关闭输入流?既然关闭了 为什么后面还能够输入enter('\n')?并且while循环里的cout << "Please enter a number: ";没有执行到,a又不是int不就符合循环条件么。。”
输入2a和回车之后,流读到的第一个字符是2,它是数字,接下去读到的是a,它不是数字,所以流在2的时候就返回了,并且是正确状态,此时cin.good()将为true,while (!(cin >> golf[i]))将为false,所以cout << "Please enter a number: ";就没有执行到。注意,输入2a和回车后,流就关闭了,缓冲区已经存有所有输入的字符了。