转自http://blog.163.com/sdzhangyuyin@126/blog/static/138413748201412082259975/
下面两段代码要实现的功能是往整数变量i中输入一个数据,输入数字1时退出,然而当输入一个字符时,整个程序会变成一个死循环。
C++代码:
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>>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会等待用户输入。
改正后代码:
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");
}