[問題] 關於清空鍵盤緩衝區

看板C_and_CPP (C/C++)作者 (ㄎㄎ)時間8年前 (2017/12/07 22:33), 8年前編輯推噓4(4020)
留言24則, 6人參與, 8年前最新討論串1/1
開發平台(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://www.ptt.cc/bbs/C_and_CPP/M.1512657239.A.947.html

12/07 22:48, 8年前 , 1F
XD
12/07 22:48, 1F

12/07 23:20, 8年前 , 2F
scanf("%[^\n]*s")的 "*s" !?
12/07 23:20, 2F

12/07 23:20, 8年前 , 3F
為何不用通用的 while loop 配getchar 就好
12/07 23:20, 3F

12/07 23:26, 8年前 , 4F
痾....比較短?
12/07 23:26, 4F

12/08 02:35, 8年前 , 5F
回二樓, %[..]s 用來接受一個只含 [] 裡字元的字串
12/08 02:35, 5F

12/08 02:35, 8年前 , 6F
如果 [..] 以 ^ 開頭就是接受不含這些字的字串
12/08 02:35, 6F

12/08 02:35, 8年前 , 7F
然後那個 * 表示接受輸入但不存進變數裡
12/08 02:35, 7F

12/08 02:37, 8年前 , 8F
咦等一下我好像弄錯了, 好像要 "%*[^\n]" 才對...我試一下
12/08 02:37, 8F

12/08 02:40, 8年前 , 9F
嗯, 確實是要 "%*[^\n]" 才對, [..] 的地位跟 %s 的 s 一樣
12/08 02:40, 9F

12/08 02:41, 8年前 , 10F
所以原 PO 原本的寫法變成「收一個不含換行字串進變數,
12/08 02:41, 10F

12/08 02:41, 8年前 , 11F
再收 * s 兩個字」--但原 PO 沒給位址所以是錯的寫法
12/08 02:41, 11F

12/08 02:42, 8年前 , 12F
這也解釋了為什麼原 PO 接 %*c 會無法作用的原因
12/08 02:42, 12F

12/08 02:42, 8年前 , 13F
因為在「收 * 字」的時候就炸掉了
12/08 02:42, 13F
喔喔,原來是因為這樣 %s 和 %[] 都是參數的一種,所以用了%[] 後面就不能再加s 不然會多讀取到s

12/08 02:42, 8年前 , 14F

12/08 02:42, 8年前 , 15F
/c/43591.html
12/08 02:42, 15F

12/08 02:43, 8年前 , 16F
1. fflush只對stdout有定義,所以不可接stdin
12/08 02:43, 16F

12/08 02:44, 8年前 , 17F
2. setbuf是設定接下來的緩衝區模式,並不會清空之
12/08 02:44, 17F

12/08 02:44, 8年前 , 18F
前殘留的緩衝區內容
12/08 02:44, 18F

12/08 02:45, 8年前 , 19F
3. 網站內使用 scanf("%*[^\n]%*c");
12/08 02:45, 19F

12/08 02:46, 8年前 , 20F
反正要清空stdin緩衝區要自己吃就對了,什麼內建函
12/08 02:46, 20F

12/08 02:46, 8年前 , 21F
式都不要用,免得debug底到一肚子氣XD
12/08 02:46, 21F
恩恩,感謝 難怪我看setbuf的功能好像不能清除緩衝區

12/08 03:38, 8年前 , 22F
fflush不是拿來清stdin的,他在那裡沒有定義(茶
12/08 03:38, 22F
※ 編輯: wei115 (120.109.132.226), 12/08/2017 09:51:33

12/08 10:43, 8年前 , 23F
c的標準沒定義沒錯 但POSIX有定義
12/08 10:43, 23F

12/08 10:44, 8年前 , 24F
所以回到原點 還是用while loop配getchar吧 XD
12/08 10:44, 24F
文章代碼(AID): #1QAL5Nb7 (C_and_CPP)
文章代碼(AID): #1QAL5Nb7 (C_and_CPP)