作者darkgerm (黑駿)
看板C_and_CPP
標題Re: [問題] 只允許輸入數字,非輸入數字會迴圈請你 …
時間Fri Jul 8 03:37:42 2011
我可以提供用 scanf 的寫法,不過也只是把上一位的 code 改成 C 版罷了
對照法一:
int a;
char c = getchar(); //讀入一個字元
while( c<
'0' ||
'9'<c ){ //如果不是數字的話
if(c==
'\n') printf(
"請重輸入\n");
c = getchar(); //就讀下一個字元
}
ungetc(c,
stdin); //把剛剛讀進來的吐回給stdin
scanf(
"%d",&a); //就能成功讀到數字
printf(
"%d\n",a);
對照法二:
int a;
while( scanf(
"%d",&a)==
0 ){ //scanf() 會回傳成功讀到幾個 item
char t[BUF_LEN]; //如果讀失敗就會回傳0
gets(t); //這時就會把整行讀進來,丟掉不用XD
printf(
"請輸入數字\n");
}
printf(
"%d\n",a);
p.s. 我不是高手
※ 引述《WJAider (Aider)》之銘言:
: 個人想到兩個解法: (都是 cin 的)
: #include<iostream>
: using namespace std;
: int main(){
: int a;
: while( !( cin.peek() >= '0' && cin.peek() <= '9' ) ){
: //下一個讀入字元不是數字的話進來
: 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 給高手解,小的我遺忘他很久了...
--
光明 的背後 是 黑暗
黑暗 的背後 還是 黑暗
由此可知 黑暗 > 光明 Q.E.D.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.113.230.123
→ Favonia:小心 getchar 和 scanf 都可能傳回 EOF, gets 盡量不要用 07/08 06:30
→ Favonia:a 如果沒初始化可能會有未定義行為(C)。 07/08 06:41
推 xatier:加俊學長耶! 07/08 16:08