1. 程式人生 > >C語言scanf函數返回值小記

C語言scanf函數返回值小記

失敗 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;
}

scanfgetchar函數區別很大,使用時應小心謹慎。

C語言scanf函數返回值小記