作者LPH66 (アルターエゴ)
看板C_and_CPP
標題Re: [問題] 關於清除標準輸入的緩衝區
時間Mon Sep 12 00:10:33 2016
※ 引述《jacky1989 ()》之銘言:
: 前幾天承蒙大神(LPH66)指導,說從標準輸入裝置輸入資料時,清除緩衝區
: 改用
: char t;
: while((t=getchar())&(t!=EOF))
: 在輸入時,是不是都要預先按一次Enter鍵,才能輸入資料
: 不能像之前使用fflush(stdin),直接就可以輸入資料?
所以這就是我這兩句推文在說的:
1F:→ LPH66: 因為之所以會"留有字元在輸入裡"幾乎都是前一行沒讀完09/10 02:08
2F:→ LPH66: 那就只要把前一行給讀完就好, 而一行結束就是 '\n'09/10 02:09
平常若沒有沒讀完的字元時是不需要這道手續的
在程式一開始當然是沒有沒讀完的字元, 因此就不需要
而這道手續也並不是每個輸入前都需要
大多數情形會需要它的時間只有當你有輸入單個字元和輸入其他變數混用的時候
這種狀況下因為輸入其他變數時
上一個輸入之後的 '\n' 由於不屬於該變數內容會留在輸入串列裡
因此後續在讀字元時就會讀進這個 '\n'
同樣的狀況也會發生在 gets, 它也會先吃到 '\n' 所以會讀進一個空字串
C++ stream 也是一樣的狀況, 輸入字元和輸入其他變數混用時也會發生
跟 C 的 gets 對應的 getline 也是一樣的
====
我會建議不要無腦地把清除放在所有輸入前面
而是去了解你的輸入順序和它對輸入串列的操作再決定要不要做清除
--
LPH [acronym]
= Let Program Heal us
-- New Uncyclopedian Dictionary, Minmei Publishing Co.
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.177.13.222
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1473610235.A.461.html
※ 編輯: LPH66 (180.177.13.222), 09/12/2016 00:11:53
※ 編輯: LPH66 (180.177.13.222), 09/12/2016 00:14:32