C語言中,printf()函數針對輸出不同的數據類型,有不同的格式控制符,此處匯總了一些常用的格式控制符:
%hd
用來輸出 short int 類型,hd 是 short decimal 的簡寫;%d
用來輸出 int 類型,d 是 decimal 的簡寫;%ld
用來輸出 long int 類型,ld 是 long decimal 的簡寫。
- %c:輸出一個字符。c 是 character 的簡寫。
- %s:輸出一個字符串。s 是 string 的簡寫。
- %f:輸出一個小數。f 是 float 的簡寫。
在輸出整數方面,格式控制符和整數的符號是緊密相關的,具體就是:
- %d 以十進制形式輸出有符號數;
- %u 以十進制形式輸出無符號數;
- %o 以八進制形式輸出無符號數;
- %x 以十六進制形式輸出無符號數。
printf函數並不支持“輸出負的八進制或者十六進制數”。
下表總結了不同類型的整數,以不同進制的形式輸出時對應的格式控制符(--表示沒有對應的格式控制符)
short | int | long | unsigned short | unsigned int | unsigned long | |
---|---|---|---|---|---|---|
八進制 | -- | -- | -- | %ho | %o | %lo |
十進制 | %hd | %d | %ld | %hu | %u | %lu |
十六進制 | -- | -- | -- | %hx 或者 %hX | %x 或者 %X | %lx 或者 %lX |
對於一個有符號的正數,它的符號位是0,當按照無符號數的形式讀取時,符號位就變成了數值位,但是該位恰好是0而不是1,因此,用%o或者%x輸出,不會有影響;
如果一個有符號整數是負數,這時候用%o或者%x輸出,則結果就會大相徑庭。
可以說,“有符號正數的最高位是0”這個巧合才使得%o和%x輸出有符號數時不會出錯
小數的輸出格式:
- %f 以十進制形式輸出float類型;
- %lf 以十進制形式輸出double類型;
- %e 以指數形式輸出float類型,輸出結果中的 e 小寫;
- %E 以指數形式輸出float類型,輸出結果中的 E 大寫;
- %le 以指數形式輸出double類型,輸出結果中的 e 小寫;
- %lE 以指數形式輸出double類型,輸出結果中的 E 大寫。
下面有一段演示代碼
#include <stdio.h> #include <stdlib.h> int main() { float a = 0.302; float b = 128.101; double c = 123; float d = 112.64E3; double e = 0.7623e-2; float f = 1.23002398; printf("a=%e \nb=%f \nc=%lf \nd=%lE \ne=%lf \nf=%f\n", a, b, c, d, e, f); return 0; }
輸出結果為:
a=3.020000e-01
b=128.100998
c=123.000000
d=1.126400E+05
e=0.007623
f=1.230024
對代碼的說明:
- %f 和 %lf 默認保留六位小數,不足六位以 0 補齊,超過六位按四舍五入截斷
- 將整數賦值給 float 變量時會變成小數
- 以指數形式輸出小數時,輸出結果為科學計數法;也就是說,尾數部分的取值為:0 ≤ 尾數 < 10。
- b的輸出有點讓人不理解,明明初始化的時候,只有三位小數,為什么不能精確輸出呢?這和小數在內存中的存儲形式有關,很多簡單的小數壓根不能精確存儲,所以也就不能精確輸出
另外,小數還有一種更加只能的輸出方式,就是使用%g。 %g會對比小數的十進制形式和指數形式,以最短的方式輸出小數,讓輸出結果更加簡練。所謂最短,就是輸出結果占用最少的字符。
讀者需要注意的兩點是:
- %g 默認最多保留六位有效數字,包括整數部分和小數部分;%f 和 %e 默認保留六位小數,只包括小數部分。
- %g 不會在最后強加 0 來湊夠有效數字的位數,而 %f 和 %e 會在最后強加 0 來湊夠小數部分的位數。
除了 %g,還有 %lg、%G、%lG:
- %g 和 %lg 分別用來輸出 float 類型和 double 類型,並且當以指數形式輸出時,
e
小寫。 - %G 和 %lG 也分別用來輸出 float 類型和 double 類型,只是當以指數形式輸出時,
E
大寫。