1. 程式人生 > >由於cin或者scanf造成的死迴圈問題

由於cin或者scanf造成的死迴圈問題

先粘程式碼:

    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)。