[問題] scanf一問

看板C_and_CPP (C/C++)作者 (adios)時間16年前 (2009/11/21 19:18), 編輯推噓2(208)
留言10則, 1人參與, 最新討論串1/1
#include<stdio.h> int main(void) { int input; int ch; printf("Enter an integer:"); while(scanf("%d",&input)!=1) { while((ch=getchar())!='\n') putchar(ch); printf(" is not an integer.\nEnter again:"); } printf("You've entered %d\n",input); return 0; } 這是一個只會判斷輸入是否為整數的程式 如果不是輸入整數 就會顯示"xxx is not an integer.\nEnter again:" 又會請你再輸入一次 直到輸入整數為止 現在我想把它改成只能接受正整數 我把while(scanf("%d",&input)!=1) 改為while(scanf("%d",&input)!=1 || input<0) 1. 雖然可以跑 但是那負數不會顯示出來 只會顯示" is not an integer.\nEnter again:" 請問是何原因?? 2. 又請問該怎麼改才是對的?? 試了好多種方法都有問題...orz ===== while ((ch = getchar()) != '\n') { if (scanf("%d %d",&rows, &cols) != 2) 另一個程式是這樣 會要輸入三個數 最後兩個為整數 以空白區隔 如x 1 2 也可以 3 4 5 我的疑問是 3. 為何scanf可以抓到最後兩個數字?? 第一個卻不會抓?? 4.此時getchar()的緩衝區內容應該是x 1 2 ?? -- 5L36f6d6I5207573K657273206f6E62066Y697265O666f78206172U65207375636b2e -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.36.217.17 ※ 編輯: sicao 來自: 114.36.217.17 (11/21 20:46)

11/21 21:09, , 1F
1. 請先去查明scanf的迴傳值到底是什麼意義....
11/21 21:09, 1F

11/21 21:10, , 2F
2. 您已經設定scanf要讀數字進來了, 換句話說根本達不到
11/21 21:10, 2F

11/21 21:11, , 3F
判斷是不是數字的效果吧?_?
11/21 21:11, 3F

11/21 21:12, , 4F
啊!!!!我看錯了, 請不要理會小弟上面兩點推文....Orz
11/21 21:12, 4F

11/21 21:15, , 5F
負數不會印出來, 是因為你輸入文字的case, 文字沒被讀入
11/21 21:15, 5F

11/21 21:16, , 6F
所以仍在stdin裡, 因為您可以用getchar把不要的字元抓掉
11/21 21:16, 6F

11/21 21:16, , 7F
但是負數不同, 它已經被scanf讀入input了, 所以不會保留
11/21 21:16, 7F

11/21 21:16, , 8F
在stdin, 後面的getchar自然直接拿到ENTER不印任何東西.
11/21 21:16, 8F

11/21 21:17, , 9F
所以負數的case另外拉個處理看看吧@_@"
11/21 21:17, 9F

11/21 21:19, , 10F
#1B1gbPpZ 這篇剛好有討論輸入資料流, 也許可以看看:)
11/21 21:19, 10F
文章代碼(AID): #1B1yo256 (C_and_CPP)
文章代碼(AID): #1B1yo256 (C_and_CPP)