作者wei115 (ㄎㄎ)
看板C_and_CPP
標題[問題] 關於清空鍵盤緩衝區
時間Thu Dec 7 22:33:55 2017
開發平台(Platform): (Ex: Win10, Linux, ...)
win10 + cygwin
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
GCC 6.4.0
問題(Question):
我想要清空緩衝區
試過fflush(stdin)[非標準] 和 setbuf(stdin, NULL)[標準]
但我剛剛寫的題目中卻發現這兩個都沒在工作,緩衝區一樣有東西沒被清空
但我用GDB除錯的時候就正常工作了....
最後我用scanf("%[^\n]*s"); getchar();就正常運作
直接用scanf("%[^\n]*s%*c"); 也有機率不工作
這是我對緩衝區有所誤解以至於我錯誤使用這些功能嗎?
還是這些函式沒有競爭力,不懂什麼叫做吃苦當吃補,都沒在作功德
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.126.109.77
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1512657239.A.947.html
1F:推 cuteSquirrel: XD 12/07 22:48
2F:→ galic: scanf("%[^\n]*s")的 "*s" !? 12/07 23:20
3F:→ galic: 為何不用通用的 while loop 配getchar 就好 12/07 23:20
4F:→ wei115: 痾....比較短? 12/07 23:26
5F:→ LPH66: 回二樓, %[..]s 用來接受一個只含 [] 裡字元的字串 12/08 02:35
6F:→ LPH66: 如果 [..] 以 ^ 開頭就是接受不含這些字的字串 12/08 02:35
7F:→ LPH66: 然後那個 * 表示接受輸入但不存進變數裡 12/08 02:35
8F:→ LPH66: 咦等一下我好像弄錯了, 好像要 "%*[^\n]" 才對...我試一下 12/08 02:37
9F:推 LPH66: 嗯, 確實是要 "%*[^\n]" 才對, [..] 的地位跟 %s 的 s 一樣 12/08 02:40
10F:→ LPH66: 所以原 PO 原本的寫法變成「收一個不含換行字串進變數, 12/08 02:41
11F:→ LPH66: 再收 * s 兩個字」--但原 PO 沒給位址所以是錯的寫法 12/08 02:41
12F:→ LPH66: 這也解釋了為什麼原 PO 接 %*c 會無法作用的原因 12/08 02:42
13F:→ LPH66: 因為在「收 * 字」的時候就炸掉了 12/08 02:42
喔喔,原來是因為這樣 %s 和 %[] 都是參數的一種,所以用了%[] 後面就不能再加s
不然會多讀取到s
15F:→ alan23273850: /c/43591.html 12/08 02:42
16F:→ alan23273850: 1. fflush只對stdout有定義,所以不可接stdin 12/08 02:43
17F:→ alan23273850: 2. setbuf是設定接下來的緩衝區模式,並不會清空之 12/08 02:44
18F:→ alan23273850: 前殘留的緩衝區內容 12/08 02:44
19F:→ alan23273850: 3. 網站內使用 scanf("%*[^\n]%*c"); 12/08 02:45
20F:→ alan23273850: 反正要清空stdin緩衝區要自己吃就對了,什麼內建函 12/08 02:46
21F:→ alan23273850: 式都不要用,免得debug底到一肚子氣XD 12/08 02:46
恩恩,感謝 難怪我看setbuf的功能好像不能清除緩衝區
22F:推 Davinais: fflush不是拿來清stdin的,他在那裡沒有定義(茶 12/08 03:38
※ 編輯: wei115 (120.109.132.226), 12/08/2017 09:51:33
23F:→ galic: c的標準沒定義沒錯 但POSIX有定義 12/08 10:43
24F:→ galic: 所以回到原點 還是用while loop配getchar吧 XD 12/08 10:44