[問題] 關於scanf的小問題

看板C_and_CPP作者 (炸彈貓)時間13年前 (2012/11/09 20:55), 編輯推噓1(1023)
留言24則, 5人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) win7 64bit 最近在寫處理使用者輸入資料的小程式,記得scanf有可以限制輸入樣式的用法 但是不知道為什麼輸入資料後會變無窮迴圈 QQ 餵入的資料(Input): 1A 2B 3C 4D 5E 預期的正確結果(Expected Output): 1 2 3 4 5 錯誤結果(Wrong Output): 輸出變成無窮迴圈 QQ 1 1 1 . . . 程式碼(Code):(請善用置底文網頁, 記得排版) http://ideone.com/7dstj1 補充說明(Supplement): 另外想知道有沒有完整介紹scanf的regular expression用法的資料, 大部分的找到的都很零碎。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.38.212.127

11/09 21:31, , 1F
http://ppt.cc/q8My 常用就這些,頂多加個星號(*)
11/09 21:31, 1F

11/09 21:32, , 2F
< 還是上面這篇也是被納入零碎資料 ? >
11/09 21:32, 2F

11/09 21:34, , 3F
謝謝E的資料很實用,主要是搞不懂為什麼會變成無窮迴圈?
11/09 21:34, 3F

11/09 21:35, , 4F
因為你每次都從頭開始讀,當然每次結果都一樣啊...
11/09 21:35, 4F

11/09 21:36, , 5F
而且你的 while 迴圈沒有中斷條件
11/09 21:36, 5F

11/09 21:37, , 6F
那為什麼用scanf("%s")就不會呢?
11/09 21:37, 6F

11/09 21:39, , 7F
因為 scanf 是讀串流,讀了以後會自動往後讀。
11/09 21:39, 7F

11/09 21:41, , 8F
對阿 可是用scanf("%[1-9]")就變成無窮迴圈,想知道為什麼
11/09 21:41, 8F

11/09 21:45, , 9F
你寫的程式碼不就是無窮迴圈嗎?
11/09 21:45, 9F

11/09 21:46, , 10F
我輸入1A 2B 3B 4D 5E,為什麼scanf到最後沒停下來?
11/09 21:46, 10F

11/09 21:47, , 11F
而且輸出都是1?
11/09 21:47, 11F

11/09 21:49, , 12F
大概是因為這個寫法它不會自動往後讀吧
11/09 21:49, 12F

11/09 21:50, , 13F
那請問l大知道要怎麼解決嗎?
11/09 21:50, 13F

11/09 21:51, , 14F
scanf(...) 後面接 fflush(stdin)
11/09 21:51, 14F

11/09 21:54, , 15F
感謝l大 這樣做確實有效耶 不過fflush(stdin)還蠻奇怪的
11/09 21:54, 15F

11/09 22:19, , 16F
不要 fflush(stdin) 啦囧 用 getchar() 不好嗎 OAO
11/09 22:19, 16F

11/09 22:22, , 17F
L大的說getchar()也行耶,越來越好奇是什麼原因引起的的?
11/09 22:22, 17F

11/09 22:28, , 18F
我猜是一直不吃' '空白,所以一直留在同一個地方XD
11/09 22:28, 18F

11/10 00:24, , 19F
你用scan set時,scanf讀到不屬於設定內的東西就會停住
11/10 00:24, 19F

11/10 00:25, , 20F
所以當輸入1A,他只會吃到1,A會留在stdin的暫存裡,
11/10 00:25, 20F

11/10 00:28, , 21F
到下個迴圈scanf還是吃不到數字->loop 所以把stdin洗乾
11/10 00:28, 21F

11/10 00:35, , 22F
淨就正常,我猜是這樣,不過我也剛學,有錯多多包涵啦
11/10 00:35, 22F

11/10 00:38, , 23F
另外可用fget抓留在stdin的東西來看 ideone.com/0UZeCX
11/10 00:38, 23F

11/10 00:49, , 24F
非常謝謝C大讓我知道為什麼會這樣了 :)
11/10 00:49, 24F
文章代碼(AID): #1GdFr8TA (C_and_CPP)