scanf和cin输入类型不匹配时造成的死循环问题

转自http://blog.163.com/sdzhangyuyin@126/blog/static/138413748201412082259975/

下面两段代码要实现的功能是往整数变量i中输入一个数据,输入数字1时退出,然而当输入一个字符时,整个程序会变成一个死循环。

C++代码:
int i=0;
while (i!=1)
{
cout<<"请输入一个整数:";
cin>>i;//i为整数类型,当输入一个字符时会造成死循环
cout<<endl;
}
C语言代码:
int i=0;
while (i!=1)
{
printf("请输入一个整数:");
scanf("%d",&i);//i为整数类型,当输入一个字符时会造成死循环
printf("\n");
}
原因:
造成死循环的原因也很简单,当第一次通过scanf函数读入整数时,如果我们输入的是一个字符,那么scanf将会什么都不读,直接返回0,输入错误提示信息后再次调用scanf读取时,由于我们上次输入的字符依旧在输入缓冲区里,所以scanf不需要等用户输入就 直接返回0,然后第三次……第四次……这就是死循环的原因了。
  而C++用std::cin读取整型数字的时候也会出现scanf函数的问题,当输入不是整数时,它也是直接返回,下次就死循环了。

解决办法:
那怎么解决呢?也很简单,只要在for循环内部调用scanf函数前添加一句fflush(stdin)来强制刷新输入缓冲区就可以了,这样输入缓冲区里就又是空的了,所以scanf会等待用户输入。

C++语言中,在调用cin前可以先调用cin.clear()和cin.sync(),单独调用一个是没有用的。 其实cin.clear()的作用并不像它的名字一样,当程序想要去读一个int型却读到了一个char型输入的时候,cin就会将自己的内部错误标识符设定为ios::failbit(没有错误是ios::goodbit),cin.clear()的作用不是清空输入缓冲区,而是清空这个内部错误标识符,真正清空输入缓冲区的是cin.sync(),但是只清空缓冲区也不行,因为内部错误标识符还保留着呢,下次读取的时候一看上次有错误,这次根本不读了……所以一定要一起调用。

改正后代码:
int i=0;
while (i!=1)
{
cout<<"请输入一个整数:";
cin.clear();cin.sync();
cin>>i;//i为整数类型,当输入一个字符时会造成死循环
cout<<endl;
}
int i=0;
while (i!=1)
{
printf("请输入一个整数:");
fflush(stdin);
scanf("%d",&i);//i为整数类型,当输入一个字符时会造成死循环
printf("\n");
}

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值