閑着沒事看C primer plus,看到書中對於scanf輸入的判斷,常用如下方法:
此時它將返回1視為我輸入成功,如果不為1則視為輸入失敗。那到底scanf的返回值具體指的是什么呢?
例子1:
void main()
{
int a;
int b;
int c;
printf("請輸入三個整數:");
int x=scanf("%d%d%d",&a,&b,&c);
printf("%d/n%d/n",a,x);
}
運行結果是:
如果輸入1 2 3, x = 3;
如果輸入1 2 g, x = 2; (g表示我沒按照scanf的格式符%d輸入,也就是不符合格式符形式的輸入)
如果輸入1 g g, x = 1;
如果輸入g g g, x = 0;
如果輸入g 1 1, x = 0;
如果輸入1 g 1, x = 1;
據此,得出的結論是,scanf返回的是到第一個錯誤的輸入形式為止(如果沒有那就到結尾唄),所有符合格式符的正確輸入的個數。
如果這個結論各位明白,那情況下面一行語句,看i結果是多少?
i=scanf("%d%d%d",&a,&b);
運行結果是:同例子1
此例子中格式占位符%d有三個,對應的輸入表項有倆。但是運行時依舊被要求輸入三個(windows, DevC++)。輸入的第三個整數確實沒有承接變量,是被放到了緩沖區里面。但當輸入是1 2 3三個正確整數時,返回值仍是3。
這就是需要強調的第二點:scanf 函數的返回值反映的是按照指定的格式符正確讀入的數據的個數。而不管你輸入表項是否齊全。
Ps:有的編譯環境以上操作可能存在問題,比如scanf("%d%d%d",&a,&b); 會出現段錯誤。這有賴於編譯器實現。
所以能理解到的是scanf有可能在不同環境下返回值的情況是不同的,可移植情況是有待考慮的。
而且C語言編程,怎么能看出一個程序員是老程序員,就是他寫的程序是否穩定。他們可能忘記了這些具體的細節(具體返回值表示什么),但是他們始終保持不觸碰模棱兩可的地方。比如這個scanf返回值最多就是判斷是否>0,再多則不利用。
引用:http://blog.csdn.net/linuxxulin/article/details/7018321