解决输入流中的错误输入的方法

转载:出自我的一位朋友空间

我们知道 C++程序有着严格的变量类型的定义,对于每一个变量,都有一个类型与之对应,但是我们输入值给某个变量的时候经常会输入错误,比如程序要你输入整数,你却输入一个小数,这样导致数值的小数部分堵住了输入流,不让你进行下一次输入(其结果是程序直接跳过输入语句执行下一语句),这样的事情常有,而结果是导致程序不能正常运行。­

下面举一个简单的列子:­

#include <iostream>­

using namespace std;­

void main(){­

int test;­

do{­

  cout<<"输入一个在1到10之间的整数:";­

  cin>>test;  //注意这个语句­

  if (test<1 || test >10){­

   cout<<"输入错误!"<<endl;­

   continue;­

  }­

  cout<<"你输入的是"<<test <<" "<<"输入正确!"<<endl;­

  ­

}while(test!=5);­

当你输入一个整数的时候,比如3,那么程序就会显示:­

你输入的是3输入正确!­

输入一个在1到10之间的整数:­

由于3!=5 因此程序进入新的一轮循环,本来这个程序很简单,可是我毕竟是TC,TC做的事情不是普通人所能想到的,我输入了一个小数比如2.5­

奇迹,恩,不应该说是奇迹,应该是列外,正所谓TC万虑,可能有一失。­

程序出现混乱,非常混乱,就相当于没有执行cin>>test; 而默认test==2一样。­

这是什么原因?难道是BUG,天哪,我无意之间发现了微软的致命错误!­

恩,貌似我没有这么伟大(暂时),经过我多方面的努力,克服万千困难(其中的困难不是你们所能想象到的),终于明白了其中的道理。­

公理­

     所有从标准输入设备输入的数据都是先保存在缓冲区中,然后istream对象再从缓冲区中进行提取。­

     我来简单的解释一下,我们输入3的时候,数据3先保存在缓冲区中,然后iostream中的对象从缓冲区中读入3赋值给int型变量给test,但是我们输入2.5的时候,2.5读入了缓冲区,然后iostream对象读取2.5的整数部分赋值给int型变量test就是2,那有人就问,那么那0.5跑到哪去了?很简单,那个0.5正躺在缓冲区中,挡住输入流(因为无法被读取),输入流就像一个个数据堆在那里,必须按数据的顺序进行读取(不然咋叫流呢),它不被读取就不让istream对象读取它后边的数据。­

现在知道了为啥输入2.5之后程序就会出现错误,仿佛不运行语句cin>>test;了吧。因为cin不能对缓冲区进行读取,因为数据不是整形。读取不了。结果程序就跳过这句直接执行后边去了。这样就出现了错误。­

说了半天,那怎样解决这个问题呢?­

很简单­

在cin>>test;后边加­

cin.clear();     //清除错误状态!­

cin.sync();    //清空缓存区!­

其实只要加cin.sync(); 一个就可以了,这样,2.5的小数部分就被清除掉了,也就不会影响后边数据的读取了。­

DLTC全手打,好累啊­

2009年4月14晚­

附:上面的cin默认参数为0,即无错误,正常操作.当我们输入英文字母'k'时,它的状态标识改为fail(即1),即错误,用cout对用户输出信息,再用cin.clear让错误标识改回为0,让我们可以继续输入,再清空流数据继续输入.如果我们没有了cin.clear,则会进入死循环,其过程为我们输入了英文字母,它的状态标识便为fail,当运行到条件判断时,便总是回到错误的条件表示里,并且我们再也没办法输入,因为错误的表示关闭了cin,所以会进入死循环.。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值