Re: [問題] 希望輸入數字但輸入的是文字
※ 引述《NIKE74731 (做遊戲的心)》之銘言:
#include <limits>
: int i_piece;//玩家所輸入之數字
: int inputOK = 1;
: do{
: cout << "請輸入號碼(1~9)....";
: cin >> i_piece;
- if(i_piece>0 && i_piece<10){//判斷是否介於1~9之間
+ if(cin && i_piece>0 && i_piece<10){
: if(i_board.arr[i_piece] == 0) {//判斷是否未放置棋子
: i_board.last_put = i_piece;
: i_board.arr[i_piece] = 1;
: player_arr[player_count] = i_piece;
: player_count++;
: inputOK = 0;
: }
: else cout << "此位置已置放棋子,請選擇其它位置........" << endl;
: }
- else cout << "您輸入的並非1~9其中一個數字,再輸入一次..." << endl;
+ else {
+ cout << "您輸入的並非1~9其中一個數字,再輸入一次..." << endl;
+ if (!cin){
+ cin.clear();
+ cin.ignore(std::numeric_limits<streamsize>::max(),'\n');
+ }
+ }
: }while(inputOK);
: 這是我做的井字遊戲的使用者輸入部份
: 但是我如果輸入非數字的資料(e.x 英文字母abc之類的)
: 就會進入無窮迴圈
: 且會一直顯示您輸入的並非1~9其中一個數字,再輸入一次...
: 請問問題出在哪裡呢?
因為預期要讀入的是數字,輸入其他文字的話,stream 會進入錯誤狀態
之後他不會再進行輸入動作,所以 "cin >> i_piece;" 會沒有效果
加上你的 i_piece 沒有初始化
(執行時,其值幾乎一定在 1~9 範圍之外,例如 0xCCCCCCCC)
所以緊接著的 if(i_piece>0 && i_piece<10) 判斷又會為 false
顯示 "您輸入的並非1~9其中一個數字,再輸入一次"
之後就是這樣的循環,所以無窮迴圈印出錯誤訊息
要讓它在輸入非預期的文字之後能夠繼續運作
得先呼叫 clear() member function 來重設狀態 (預設是重設為 goodbit)
然後只要忽略掉輸入緩衝區的剩下所有字元
這樣下次進入迴圈就能重新進行輸入
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.115.53.23
推
12/23 21:42, , 1F
12/23 21:42, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):