C語言scanf函數返回值小記
阿新 • • 發佈:2018-11-06
失敗 code class 發現 用戶輸入 什麽 stdio.h 接受 例子
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
函數區別很大,使用時應小心謹慎。
C語言scanf函數返回值小記