scanf清除緩存區


  為什么需要清除scanf緩存區呢?看一個例子:

int main() { int a,b; scanf("%d",&a); scanf("%d",&b); printf("a=%d ",a); printf("b=%d",b); return 0; }

  以上是一個很簡單的例子,輸入兩個整型數再打印出來,看起來的確很簡單,也沒啥問題。

  但是如果第一個(即a)輸入的不是整型,比如字符或字符串呢?這樣的話第二個(即b)就不會讓用戶輸入而直接程序結束了。

  又如以下程序:

int main() { char ch1; char ch2; ch1 = getchar(); ch2 = getchar(); // scanf("%c",&ch1); // scanf("%c",&ch2);
 printf("%d %d", ch1, ch2); return 0; }

  或者如下程序:

int main() { char ch1; char ch2; // ch1 = getchar(); // ch2 = getchar();
 scanf("%c",&ch1); scanf("%c",&ch2); printf("%d %d", ch1, ch2); return 0; }

  程序的本意很簡單,就是從鍵盤讀入兩個字符,然后打印出這兩個字符的ASCII碼值。可是執行程序后會發現出了問題:當從鍵盤輸入一個字符后,就打印出了結果,根本就沒有輸入第二個字符程序就結束了。例如用戶輸入字符'a', 打印結果是97,10。這是為什么呢?

【分析】

  scanf() 和getchar()函數是從輸入流緩沖區中讀取值的,而並非從鍵盤(也就是終端)緩沖區讀取。而讀取時遇到回車(n)而結束的,這個n會一起讀入輸入流緩沖區的,所以第一次接受輸入時取走字符后會留下字符n,這樣第二次的讀入函數直接從緩沖區中把n取走了,顯然讀取成功了,所以不會再從終端讀取!其實這里的10恰好是回車符!這就是為什么這個程序只執行了一次輸入操作就結束的原因!

【解決辦法】

  從輸入緩存區讀取后,清除掉之前的緩存。

  方法有很多,推薦比較簡單的兩種:

fflush(stdin);//這種在VS和Clion上不成功
rewind(stdin);
 比如:
int main() { char ch1; char ch2; ch1 = getchar(); rewind(stdin); ch2 = getchar(); // scanf("%c",&ch1); // scanf("%c",&ch2);
 printf("%d %d", ch1, ch2); return 0; }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM