看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《junny0204 (~睿~)》之銘言: : 開發平台(Platform): Dev-C++ : 問題(Question):如何解決輸入英文字母也會判斷 : 餵入的資料(Input):A,B,C,a,b,c...etc : 預期的正確結果(Expected Output):及格和不及格 : 程式碼(Code): : # include <iostream> : using namespace std; : int main(){ : int a; : cout<<"請輸入一個分數"<<endl; : cin>>a; : if (a>=0&&a<=100) : { : if (a>=60) : cout<<"及格"<<endl; : else : cout<<"不及格"<<endl; : } : else : cout<<"成績輸入錯誤"<<endl; : system("pause"); : return 0; : } : 補充說明(Supplement): : 我是想要讓使用者只能輸入數字,如果不是輸入數字 : 就會一直迴圈請你輸入數字 : 或者直接印出輸入錯誤的訊息 : 正確來說應該要能出現提示 一直說重新輸入正確數字或是選擇離開 : 這樣是最好的 : 有爬過文...有人說cin 和 scanf有差別 : 不知道我這個問題能不能 用cin和scanf 都有不解法呢? : 感謝各位大大幫忙! 個人想到兩個解法: (都是 cin 的) #include<iostream> using namespace std; int main(){ int a; while( !( cin.peek() >= '0' && cin.peek() <= '9' ) ){ //下一個讀入字元不是數字的話進來 if( !cin ) cin.clear(); //加此行防止檔案末尾 cin.get(); //吐掉或 //if( cin.get() == '\n' ) cout << "請輸入數字" << endl; //吐到換行字元就提醒他輸入數字 } cin >> a; //必定成功 cout << a << endl; return 0; } 註: cin.peek() 可以回傳下一個讀進來的字元 cin.get() 讀入一個字元並回傳,沒有 char 去接收的話就跟吐掉一個字元一樣 while 敘述也可改成 while( cin.peek() < '0' || cin.peek() > '9' ){ ... } 如果輸入的內文包含數字跟英文夾雜,會把第一串連續的數字輸入給 a ex: input: "aa123cc321" => a == 123 #include<iostream> #include<string> using namespace std; int main(){ int a; string str; while( !( cin >> a ) ){ cin.clear(); //清除 ios_base::failbit getline( cin, str ); //清掉一行 //cout << "請輸入數字" << endl; } cout << a << endl; return 0; } 註: cin >> a 失敗的時候,cin 的 ios_base::failbit 這個 flag 會打開 然後就不能輸入了 cin.clear() 就是把 ios_base::failbit 關掉 (換成 goodbit ) 可是之前輸入的資料還在,所以用 getline( cin, str ) 取出塞進 str 中 再繼續讀,讀到對為止 cin >> a 把 cin 的東西輸入給 a 還會回傳 cin 本身 而 !cin 回傳 cin.fail() ,也就是 cin 的 failbit 的開啟狀況 所以 !( cin >> a ) 代表 cin 輸入給 a 後 cin 的 failbit 的開啟狀況 因此也可以 while( ( cin >> a ).fail() ){ ... } 如果那行是非數字開頭就會重新輸入 如果數字+英文還是會輸入給a ex: input: 123aaa => a == 123 如果要實現 123aaa 要求重新輸入的話可能真的要先 cin >> str 再處理吧 以上 scanf 給高手解,小的我遺忘他很久了... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 182.235.35.88
Favonia:小心 peek() 遇到結尾會傳回 eof... 07/08 06:27
WJAider: cin 有結尾嗎? 怎麼才會觸發? Sorry 因為我沒遇過... 07/08 11:11
firejox:Win ^Z ,Unix ^D就會有了 07/08 11:20
多謝提醒,已加上 順便付上可以實現 123aaa 要求重新輸入的程式碼 #include<iostream> #include<string> #include<sstream> using namespace std; int main(){ int a; string str; do{ if( !cin ) cin.clear(); //防止讀入終止字元 getline( cin, str ); }while( str.find_first_not_of( "0123456789" ) != string::npos || str.size() == 0 ); istringstream( str ) >> a; cout << a << endl; return 0; } 附註...有人問我晚點再打 以上 ※ 編輯: WJAider 來自: 182.235.35.88 (07/08 15:11)
Favonia:一開始 EOF 程式就不會結束了... 還是說本來就要這樣 xDDD 07/08 20:20