Re: [問題] 希望輸入數字但輸入的是文字

看板C_and_CPP作者 (有趣生活)時間14年前 (2009/12/23 20:33), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《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
文章代碼(AID): #1BCWuobh (C_and_CPP)
文章代碼(AID): #1BCWuobh (C_and_CPP)