讀古今文學網 > C語言解惑 > 2.3 輸入的格式配對錯誤 >

2.3 輸入的格式配對錯誤

【例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