看板 C_and_CPP 關於我們 聯絡資訊
我可以提供用 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