scanf()中清除輸入緩沖區的幾種方法歸納,scanf緩沖區
應用場景:我們使用多個scanf()的時候,如果輸入緩沖區還有數據的話,那麼scanf()就不會詢問用戶輸入,而是直接就將輸入緩沖區的內容拿出來用了,這就導致了前面的錯誤影響到後面的內容,為了隔離這種問題,
總的思想:通過各種方法將輸入緩沖區的內容讀出來.
方法一:使用scanf(“%*[^\n]%*c”):成功;
解釋:
1.這裡的星號’*’表示讀入某類型的內容,但是這個內容不保存到變量裡,所以後面不需要對應的參量;
也就是說,只要我再%後面加入星號之後,後沒可以不放置接收的變量.
2.scanf(“%*[^\n]%*c”)的%*[^\n]表示讀入除了回車之外的字符以及讀入一個字符後不保存,只有這樣,才不會把我輸入回車吸收,導致我不能退出程序.但是按照這種方法應該%*s應該也行,但是不行,具體不知道為啥.
3.[]內是只讀入限定讀入的字符,如:[abcd]指的是只讀入abcd的字符
4.所以整行代碼的解釋是"%*[^\n]"首先讀入緩沖區的剩余內容,%*c是讀入最後一個沒有讀入的回車;這樣就清空的輸入緩沖區.
方法二:使用fflush(stdin)不成功,估計和系統的機制有關,有人測試vc是ok的,但是xcode和linux系統下都不成功;
方法三:使用getchar+while成功;
使用while(getBuff=getchar()!=‘\n’ && getBuff!=EOF),使用循環把緩沖區的讀完,直到讀到緩沖區的\n或者是空值;
方法四:使用gets+預留最大值成功;
使用gets,創建一個數組,將緩沖區的內容讀完;
方法三方法四都是使用流的方式,把剩余的東西一並讀完,管他是不是\n,還是這個比較舒心
方法五:rewind(stdin),這個在xcode可以,真是奇怪,rewind是移動指針到開頭是可以,清空輸入不可以,真是奇了怪了;