為什麼這篇c連續輸入數字鄉民發文收入到精華區:因為在c連續輸入數字這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者WJAider (Aider)看板C_and_CPP標題Re: [問題] 只允許輸入數字,非輸入...
※ 引述《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
多謝提醒,已加上
順便付上可以實現 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)