爲何須要清除scanf緩存區呢?看一個例子:緩存
int main() { int a,b; scanf("%d",&a); scanf("%d",&b); printf("a=%d ",a); printf("b=%d",b); return 0; }
以上是一個很簡單的例子,輸入兩個整型數再打印出來,看起來的確很簡單,也沒啥問題。函數
可是若是第一個(即a)輸入的不是整型,好比字符或字符串呢?這樣的話第二個(即b)就不會讓用戶輸入而直接程序結束了。spa
又如如下程序:code
int main() { char ch1; char ch2; ch1 = getchar(); ch2 = getchar(); // scanf("%c",&ch1); // scanf("%c",&ch2);
printf("%d %d", ch1, ch2); return 0; }
或者以下程序:blog
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。這是爲何呢?字符串
【分析】get
scanf() 和getchar()函數是從輸入流緩衝區中讀取值的,而並不是從鍵盤(也就是終端)緩衝區讀取。而讀取時遇到回車(n)而結束的,這個n會一塊兒讀入輸入流緩衝區的,因此第一次接受輸入時取走字符後會留下字符n,這樣第二次的讀入函數直接從緩衝區中把n取走了,顯然讀取成功了,因此不會再從終端讀取!其實這裏的10剛好是回車符!這就是爲何這個程序只執行了一次輸入操做就結束的緣由!
io
【解決辦法】class
從輸入緩存區讀取後,清除掉以前的緩存。終端
方法有不少,推薦比較簡單的兩種:
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; }