爲什麼fflush(stdin)用了並不能清除緩衝區

爲什麼fflush(stdin)用了並不能清除緩衝區

很多人在教材上都看到fflush(stdin)這個函數的使用,教材給出的解釋是清除緩衝區,可是一些動手實踐過代碼的小夥伴發現,fflush(stdin)這個函數並沒有起到清除緩衝區的作用,那這是什麼原因呢?

教材中fflush(stdin)的來源

fflush(stdin)這個函數官方給出的解釋是:由Microsoft官方提供的MSDN 文檔裏清楚地寫着:fflush on input stream is an extension to the C standard。這僅僅是對於C語言的一種擴展,而並不是C語言內置的系統函數,而這種擴展的函數在當時能夠實現清除緩衝區的功能,所以當時在需要清除緩衝區的時候就使用fflush(stdin)來清除緩衝區,然而教材一般都是版本比較老的,所有也就這樣地寫到。

爲什麼現在不能夠使用了

在解釋教材中爲什麼出現fflush(stdin)中也特意使用了當時這一詞。因爲在現在和當時使用fflush(stdin)的情況不一樣了,在C11之前,fflush(stdin)還能夠使用,並且是實現清除緩衝區的功能,但是在C11之後,fflush(stdin)已經被刪除了,就是起不到清除緩衝區的功能了。至於爲什麼刪除,是因爲fflush(stdin)這個函數對於緩衝區並沒有很好的解決,這裏也不去深究。

那麼現在如何清除緩衝區呢

現在主流的方法主要爲兩個:

  1. 使用rewind(stdin);
    這個函數與fflush(stdin)很相似,應該是fflush(stdin)的改版。這個雖然也不是標準的定義函數,但是現在也沒有很好的解決方法,也是將fflush(stdin)清除功能後的一個補充。
  2. 使用scanf("%*[^\n]%*c");
    給出對於這個輸入函數的一個解釋: %*[^\n]將逐個讀取緩衝區中的’\n’字符之前的其它字符,%後面的*表示將讀取的這些字符丟棄,前遇到’\n’字符時便停止讀取操作,此時,緩衝區中尚有一個’\n’字符遺留,所以後面的%*c將讀取並丟棄這個遺留的換行符,這裏的星號和前面的星號作用相同。由於所有從鍵盤的輸入都是以回車結束的,而回車會產生一個’\n’字符,所以將’\n’連同它之前的字符全部讀取並丟棄之後,也就相當於清除了輸入緩衝區。

緩衝區刷新條件

  1. 緩衝區滿時
  2. 執行flush語句
  3. 執行endl語句
  4. 關閉文件

使用fflush(stdin)注意事項

如果實在想試試穿越時空的功能,在使用fflush(stdin)時,必須保證你的編譯環境在C11以前,如果你使用得當編譯器是Visual Studio,那麼就注意下你的Visual Studio的版本,在Visual Studio 2015以前,這個函數都是能夠使用的,但是在Visual Studio 2015以後,包括Visual Studio 2015,這個函數已經確切地被取消這一功能了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章