stream库输入缓冲区的问题

在论坛上看到这么一个题

设置常量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和回车后,流就关闭了,缓冲区已经存有所有输入的字符了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值