1. 程式人生 > >scanf返回值問題

scanf返回值問題

環境 net 如果 段錯誤 返回值 緩沖 判斷 ron png

閑著沒事看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

scanf返回值問題