【例2.3】下面的程序不能正常運行,是何原因?
#include <stdio.h> void main ( ) { double x ,y ; printf ( " 輸入x 和y 的值:" ); scanf ( "%f%f" ,&x ,&y ); printf ( "%g+%g=%g\n" ,x ,y ,x+y ); }
運行示範如下。
輸入x 和y 的值: 2.1 3.4 -9.25596e+061+-9.25596e+061=-1.85119e+062
有人可能認為是printf語句的問題,其實不是,g格式符用來輸出實數,它根據數值的大小自動選f格式或e格式。輸出double(包括long double)格式的數據不需要使用lf,所以這個格式是正確的。
經過分析,只能認為是scanf的格式不對了。f是輸入實數(浮點數),輸入數據可以用小數形式或指數形式。e與f作用相同並可以互相替換,所以只能去看lf格式了。
「l」格式用於輸入長整型數據,說明相應的參數是long型,而不是int型。讀入float數據時,說明相應的參數應是double型。由此可以得出結論:是格式不匹配造成的錯誤,應將格式符改為「lf」或者將聲明改為「float」型。將scanf語句改為
scanf ("%lf%lf" ,&x ,&y );
則得到正確的演示輸出結果為「2.1+3.4=5.5」。這種改動對將聲明改為
long double x ,y ;
也是正確的。如果不改變scanf語句,可以將聲明改為
float x ,y ;
需要注意的是,這時scanf雖然不能使用「lf」格式,但可以使用e格式,即
scanf ("%e%e" ,&x ,&y );
當然,這種情況也支持g格式,即
scanf ("%g%g" ,&x ,&y );
注意它們只對float聲明的變量有效,對使用double格式聲明的變量無效。
【例2.4】下面程序錯在哪裡?分析分別輸入123456789和123 456 789時的輸出結果。
#include <stdio.h> void main ( ) { int a=9 ,b=5 ,c=0 ; char c='A' ; printf (" 輸入:" ); scanf ("%2d%*3d%d%c" ,&a ,&b ,&c ); printf (" 輸出:a=%g ,b=%g ,c=%c\n" ,a ,b ,c ); }
錯在混淆了整數和浮點數的格式,g對整數無效。應該改為
printf (" 輸出:a=%d ,b=%d ,c=%c\n" ,a ,b ,c );
輸入語句中的「*」號表示本輸入項在讀入數據後不賦給相應的變量。%2d用來指定數據位數的寬度為2。如輸入123456789,則對應於%2d的格式是把數據前面的12存入變量a中;%*3d表示輸入3位數,但不賦給任何變量,即不使用數據345;後面的格式是%d,它沒有數字域,所以將6789賦給b。因為後面是換行符,所以c存入的是換行符。如果c是使用%d輸出,則輸出「c=10」。但這裡是使用%c,換行符不是可顯示字符,所以運行結果為
輸入: 123456789 輸出:a=12 ,b=6789 ,c=
需要注意的是,如將這條語句改為
scanf ("%2d%*3d%1d%c" ,&a ,&b ,&c );
則輸出演示的結果為
輸出:a=12 ,b=6 ,c=7
雖然%1d是使b只取1位數字(即數字6),但b不用的數據(789)仍然能供後面使用。因為這是一組輸入,%*只是修飾捨掉的位數,後面的%1d格式是取捨給變量的格式,剩下數據789,c是單字符型而不是字符串,所以只能取數據7。
回到原來的程序,當輸入123 456 789時,結果又不一樣。它將12賦給a,丟棄3,但3之後是空格,編譯系統認為這個字符串已經結束,就把下面的字符串456賦給b,雖然有789的輸入,但它們與456之間有一個空格,所以是用這個空格為c賦值,輸出演示的結果為
輸入: 123 456 789 輸出:a=12 ,b=456 ,c=
被捨棄的字符串是以空格區分的,如果數量不夠,也只捨棄到空格為止。如果數量足夠,則取捨到規定數量,將剩下的賦給變量。例如:
輸入: 1 2 3456 789 輸出:a=1 ,b=3456 ,c= 輸入: 1 23456 789 輸出:a=1 ,b=56 ,c=
如果用%d輸出c,則c=32。如果想讓789賦給c,則要將c定義為字符串。
【例2.5】使用字符串的例子。
#include <stdio.h> void main ( ) { int a=9 ,b=5 ; char c[4] ; printf (" 輸入:" ); scanf ("%2d%*3d%d%s" ,&a ,&b ,&c ); printf (" 輸出:a=%d ,b=%d ,c=%s\n" ,a ,b ,c ); }
運行實例如下。
輸入: 123 456 789 輸出:a=12 ,b=456 ,c=789