先粘代码:
int iSelect = 0;
while (1)
{
std::cin >> iSelect;
switch (iSelect)
{
case -1:
break;
case 0:
break;
case 1:
break;
case 2:
break;
default:
std::cout << "argument error" << std::endl;
break;
}
if (-1 == iSelect)
break;
}
程序很简单,就是想循环选择-1到2之间的数字,然后进行对应的操作。但是有个很诡异的问题,当输入的iSelect不是数字,而是字符的时候,那么程序就会陷入死循环。
原理:程序陷入死循环是因为内部,调用cin或者scanf的时候,如果发现输入缓冲区的数据是非数字的字符的时候,就会放弃本次读取。读取标识符也不会辨识为读取。
解决方法:如果是cin,那么需要在程序循环的开头调用std::cin.clear()清空输入缓冲区,并且调用std::cin.sync()标识缓冲区读取标识符。如果是scanf,那么需要刷新缓冲区,调用fflush(stdin)。