(1)簡介:
printf函數是c語言當中非常重要的格式化輸出函數
其函數原型為:int printf(const char *format, ...);
其函數返回值:打印出的字符格式
其調用格式為:printf("<格式化字符串>", <參量表>);
(2)轉換說明:
轉換格式為:%[標志][寬度][.精度][類型長度]類型
除了最后的類型之外都是可選的字段
標志 | 意義 |
- | 項目是左對齊的;也就是說,會把項目打印在字段的左側開始處。示例:"%-20s" |
+ | 有符號的值若為正,則顯示帶加號的符號;若為負,則帶減號的符號。示例:"%+6.2f" |
(空格) | 帶符號的值若為正,則顯示時帶前導空格(但是不顯示符號);若為負,則帶減號符號。+標志會覆蓋空格標志;示例:"% 6.2f" |
# | 使用轉換說明的可選形式。若為%o格式,則以0開始;若為%x或%X格式,則以0x或0X開始。對於所有的浮點形式,#保證了即使不跟任何數字,也打印一個小數點符號。對於%g和%G格式,它防止尾隨0被刪除;示例:"%#o" |
0 | 對於所有的數字格式,用前導0而不是用空格填充字段。如果出現-標志或者指定了精度(對於整數)則忽略該標志;示例:"%010d" |
修飾符 | 意義 |
digit(s) | 字段寬度的最小。如果該字段不能容納要打印的數或者字符串,系統就會使用更寬的字段。示例:"%4d" |
.digit(s) | 精度,對於%e,%E和%f轉換,是將要在小數點的右邊打印的數字的位數。對於%g和%G轉換,是有效數字的最大位數。對於%s轉換,是將要打印的字符的最大數目。對於整數轉換,是將要打印的數字的最小位數;如果必要,要使用前導0來達到這個位數。只使用"."表示其后跟隨一個零,所以%.f和%.0f相同;示例:"%5.2f"打印一個浮點數,他的字段寬度為5個字符,小數點后面有兩位數字 |
修飾符 | 意義 |
h | 和整數轉換說明符一起使用,表示一個short int或unsigned short int類型數值;示例:"%hu" "%hd" "%hx" |
hh | 和整數轉換說明符一起使用,表示一個signed char或unsigned char類型數值;示例:"%hhu" "%hhd" "%hhx" |
j | 和整數轉換說明符一起使用,表示一個intmax_t或uintmax_t值;示例:"%jd" "%jX" |
l | 和整數轉換說明符一起使用,表示一個long int或unsigned long int類型數值;示例:"%lu" "%ld" |
ll | 和整數轉換說明符一起使用,表示一個long long int或unsigned long long int類型數值(c99);示例:"%llu" "%lld" |
L | 和浮點轉換說明符一起使用,表示一個long double值;示例:"%Lf" "%Le" |
t | 和整數轉換說明符一起使用,表示一個ptrdiff_t值(與兩個指針之間的差對應的類型)(c99);示例:"%td" |
z | 和整數轉換說明符一起使用,表示一個size_t值(sizeof返回類型)(c99);示例:"%zd" |
I64 | 和整數轉換說明符一起使用,表示一個_int64值 |
轉換說明 | 輸出 |
%a | 浮點數、十六進制數字和p-計數法(c99) |
%A | 浮點數、十六進制數字和P-計數法(c99) |
%c | 一個字符 |
%d | 有符號十進制整數 |
%e | 浮點數、e-記數法 |
%E | 浮點數、E-計數法 |
%f | 浮點數、十進制記數法 |
%g | 根據數值不同自動選擇%f或%e。%e格式在指數小於-4或者大於精度時使用 |
%G | 根據數值不同自動選擇%f或%E。%E格式在指數小於-4或者大於精度時使用 |
%i | 有符號十進制整數(與%d相同) |
%o | 有符號八進制整數 |
%p | 指針 |
%s | 字符串 |
%u | 無符號十進制整數 |
%x | 使用十六進制數0x的無符號十六進制整數 |
%X | 使用十六進制數字0X的無符號十六進制證書 |
%% | 打印一個百分號 |
(3)示例:
1 #include <stdio.h> 2 3 int main() { 4 const char * pString = "Hello World"; 5 const int nNumber = 1024; 6 const double dNumber = 3.141593; 7 // %d 示例 8 printf("*%d*\n", nNumber); //輸出:*1024* 9 printf("*%6d*\n", nNumber); //輸出:* 1024* 10 printf("*%6.5d*\n", nNumber); //輸出:* 01024* 11 printf("*%-6.5d*\n", nNumber); //輸出:*01024 * 12 printf("*%06d*\n", nNumber); //輸出:*001024* 13 printf("*%+6d*\n", nNumber); //輸出:* +1024* 14 15 // %f 示例 16 printf("*%f*\n", dNumber); //輸出:*3.141593* 17 printf("*%10f*\n", dNumber); //輸出:* 3.141593* 18 printf("*%10.2f*\n", dNumber); //輸出:* 3.14* 19 printf("*%-10.2f*\n", dNumber); //輸出:*3.14 * 20 printf("*%+10.2f*\n", dNumber); //輸出:* +3.14* 21 printf("*%010.2f*\n", dNumber); //輸出:*0000003.14* 22 23 // %s 示例 24 printf("*%s*\n", pString); //輸出:*Hello World* 25 printf("*%20s*\n", pString); //輸出:* Hello World* 26 printf("*%-20s*\n", pString); //輸出:*Hello World * 27 printf("*%.10s*\n", pString); //輸出:*Hello Worl* 28 return 0; 29 }
(4)浮點參數的轉換:
有用於打印浮點類型double和long double的轉換說明符,但沒有用於float的說明符。原因是在K&R C中float值在被用於表達式中或者被用作參數之前,會被自動轉換成double類型。一般情況下,ANSI C不會自動把float轉換成double。不過,為了保護大量現有的假設float參數仍會自動被轉換成double。因此,不過是K&R C還是ANSI C,都無需專門的轉換說明符來顯示float。