C語言scanf函數返回值小記


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函數區別很大,使用時應小心謹慎。


免責聲明!

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



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