[爆卦]c連續輸入數字是什麼?優點缺點精華區懶人包

為什麼這篇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
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

你可能也想看看

搜尋相關網站