scanf
scanf是C標准庫stdio里面定義的用於獲取用戶輸入的函數,具體的介紹可以在CppReference上看到。scanf的返回值是已經成功賦值的變量個數,也就是說在
scanf("%d %d",&a,&b)這個調用返回的值在用戶輸入1 2時返回的是2,如果用戶輸入的是1 b,那么返回值為1,如果輸入的是a b,那么返回的是0。
問題
剛剛用了這個例子,發現輸入字母時會導致一直無限輸出0:
#include <stdio.h>
int main(void) {
int x = 0;
while (1){
x = scanf("%d",&x);
printf("%d",x);
}
return 0;
}
仔細分析一下,就知道原因為何:
scanf這里要求輸入參數為數字,輸入字母會導致賦值失敗,因此scanf返回值一直為0,也就導致輸出0。- 至於為什么一直輸出0是因為
scanf對於接受失敗的數據會送回stdin緩沖區,之前輸入的字母會一直存在。在這個死循環中,scanf一遍遍讀緩沖區的字母,也就會一直輸出已一大串0。要想像輸入數字那樣可以循環輸入,必須清除掉緩沖區的數據:setbuf(stdin,NULL);,這個語句加到scanf后面,如下所示:
#include <stdio.h>
int main() {
int x = 0;
while (1){
x = scanf("%d",&x);
setbuf(stdin,NULL);
printf("%d",x);
}
return 0;
}
scanf與getchar函數區別很大,使用時應小心謹慎。
