VS编译器的记忆问题

#include <iostream>
  #include <stdexcept> //runtime_error在其中定义
  using namespace std;
  int main(){
        int ival;
       while(cin>> ival,!cin.eof()){
           if (cin.bad())
              throw runtime_error("IO stream corrupted");
           if (cin.fail()){
              cerr << "bad data ,try again";
               cin.clear(istream::failbit);
               continue ;
               }
                }
                return 0;
               }

我输入 w 后 流处于错状态, cin.clear(istream::failbit)语句清理输入 流 的 错误信息,使流重新有校,但是程序运行时却是一直错误,那是因为错误字符w一直在缓冲区中,并没有被清除 ,cin每次从缓冲区中读入错误信息 ,即使流状态纠正,下次读取还会出错,所以程序运行时一直在错误的死循环中,但是加了两个getchar()后就好了:
#include <iostream>
  #include <stdexcept> //runtime_error在其中定义
  using namespace std;
  int main(){
        int ival;
       while(cin>> ival,!cin.eof()){
           if (cin.bad())
              throw runtime_error("IO stream corrupted");
           if (cin.fail()){
              cerr << "bad data ,try again";
               getchar();
               getchar();
               cin.clear(istream::failbit);
               continue ;
               }
                }
                return 0;
               }

第一个getchar()用于清空输入缓冲区中的错误字符w,第二个getchar()用于清空输入缓冲区中的回车符'\n' (在输入完w后,按的回车),这样输入缓冲区就能被清空,但是如果只有用一个getchar()也能解决问题,那一个getchar()和两个getchar()有什么区别?
用一个getchar(),那么输入缓冲区中还会剩下一个回车符,那时流已经处于正常状态,但是cin有个特性,他会忽略前导回车符,就是cin从缓冲区中读取数据时,如果缓冲区开头是回车符'\n'
那么cin会忽略,无论有多少个回车符,只要在缓冲区开头且连续,cin都会忽略。所以用一个getchar()也能解决问题;

如果不用getchar(),用cin.ignore(1,' '),也能解决问题(原理和一个getchar()类似),但是cin.ignore(1,' ')必须放对位置,如果放在cin.clear(istream::failbit)前是没有用的,必须放在cin.clear(istream:failbit)后面,因为放在前面的话,那时后流还处于 错误状态,cin.ignore(1,' ')不会有作用,必须在流处于正确状态才有用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值