-
printf
(格式化輸出函數)
鎖定
printf函數語法
printf函數聲明
// C99 前 int printf( const char *format, ... ); // C99 起 int printf( const char *restrict format, ... );
printf參數列表
printf功能
printf返回值
printf函數説明及應用示例
printf轉換説明詳解
説明符(specifier) | 對應數據類型 | 描述 |
---|---|---|
d / i | int | 輸出類型為有符號的十進制整數,i 是老式寫法 |
o | unsigned int | 輸出類型為無符號八進制整數(沒有前導 0) |
u | unsigned int | 輸出類型為無符號十進制整數 |
x / X | unsigned int | 輸出類型為無符號十六進制整數,x 對應的是 abcdef,X 對應的是 ABCDEF(沒有前導 0x 或者 0X) |
f / lf | double | 輸出類型為十進制表示的浮點數,默認精度為6(lf 在 C99 開始加入標準,意思和 f 相同) |
e / E | double | 輸出類型為科學計數法表示的數,此處 "e" 的大小寫代表在輸出時用的 “e” 的大小寫,默認浮點數精度為6 |
g | double | |
G | double | 根據數值不同自動選擇 %f 或 %E,%E 格式在指數小於-4或指數大於等於精度時用使用 |
c | char | 輸出類型為字符型。可以把輸入的數字按照ASCII碼相應轉換為對應的字符 |
s | char * | 輸出類型為字符串。輸出字符串中的字符直至遇到字符串中的空字符(字符串以 '\0‘ 結尾,這個 '\0' 即空字符)或者已打印了由精度指定的字符數 |
p | void * | 以16進制形式輸出指針 |
% | 不轉換參數 | 不進行轉換,輸出字符‘%’(百分號)本身 |
n | int * |
// 以下程序用於輸出各種格式化數據(其中 "\n" 表示換行的轉義字符,具體見下文的轉義字符説明): #include <stdio.h> int main() { char ch = 'h'; int count = -9234; double fp = 251.7366; // 顯示整數 printf( "Integer formats:\n" " Decimal: %d Unsigned: %u\n", count, count); printf( "Decimal %d as:\n Hex: %Xh " "C hex: 0x%x Octal: %o\n", count, count, count, count ); // 顯示字符 printf("Characters in field:\n" "%10c\n", ch); // 顯示實數 printf("Real numbers:\n %f %.2f %e %E\n", fp, fp, fp, fp ); return 0; } //程序運行結果: Integer formats: Decimal: -9234 Unsigned: 4294958062 Decimal -9234 as: Hex: FFFFDBEEh C hex: 0xffffdbee Octal: 37777755756 Characters in field: h Real numbers: 251.736600 251.74 2.517366e+002 2.517366E+002
flags(標誌) | 字符名稱 | 描述 |
---|---|---|
- | 減號 | 在給定的字段寬度內左對齊,右邊填充空格(默認右對齊) |
+ | 加號 | 強制在結果之前顯示加號或減號(+ 或 -),即正數前面會顯示 + 號; 默認情況下,只有負數前面會顯示一個 - 號 |
(空格) | 空格 | |
# | 井號 | specifier 是 o、x、X 時,增加前綴 0、0x、0X; specifier 是 e、E、f、g、G 時,一定使用小數點; specifier 是 g、G 時,尾部的 0 保留 |
0 | 數字零 | 對於所有的數字格式,使用前導零填充字段寬度(如果出現了減號標誌或者指定了精度,則忽略該標誌) |
#include <stdio.h> #define PAGES 931 int main() { const double RENT = 3852.99; // const-style constant printf("*%-10d*\n", PAGES); //左對齊,右邊補空格 printf("*%+4.2f*\n", RENT); //輸出正負號 printf("%x %X %#x\n", 31, 31, 31); //輸出0x printf("**%d**% d**% d**\n", 42, 42, -42); //正號用空格替代,負號輸出 printf("**%5d**%5.3d**%05d**%05.3d**\n", 6, 6, 6, 6); //前面補0 return 0; } //程序運行結果: *931 * *+3852.99* 1f 1F 0x1f **42** 42**-42** ** 6** 006**00006** 006**
width(最小寬度) | 字符名稱 | 描述 |
---|---|---|
digit(n) | 數字 | |
* | 星號 |
#include <stdio.h> #define PAGES 931 int main() { printf("*%2d*\n", PAGES); //輸出的字段長度大於最小寬度,不會截斷輸出 printf("*%10d*\n", PAGES); //默認右對齊,左邊補空格 printf("*%*d*\n", 2, PAGES); //等價於 printf("*%2d*\n",PAGES) return 0; } //程序運行結果: *931* * 931* *931*
.precision(精度) | 字符名稱 | 描述 |
---|---|---|
.digit(n) | 點+數字 | 對於整數説明符(d、i、o、u、x、X):precision 指定了要打印的數字的最小位數。如果寫入的值短於該數,結果會用前導零來填充。如果寫入的值長於該數,結果不會被截斷。精度為 0 意味着不寫入任何字符; 對於 e、E 和 f 説明符:要在小數點後輸出的小數位數; 對於 g 和 G 説明符:要輸出的最大有效位數; 對於 s 説明符:要輸出的最大字符數。默認情況下,所有字符都會被輸出,直到遇到末尾的空字符; 對於 c 説明符:沒有任何影響; |
.* | 點+星號 |
#include <stdio.h> int main() { const double RENT = 3852.99; // const-style constant printf("*%4.2f*\n", RENT); printf("*%3.1f*\n", RENT); printf("*%10.3f*\n", RENT); return 0; } //程序運行結果: *3852.99* *3853.0* * 3852.990*
length(類型長度) | 描述 |
---|---|
h | |
l |
#include <stdio.h> #define PAGES 336 int main() { short num = PAGES; long n3 = 2000000000; long n4 = 1234567890; printf("num as short and unsigned short: %hd %hu\n", num, num); printf("%ld %ld\n", n3, n4); return 0; } //程序運行結果: num as short and unsigned short: 336 336 2000000000 1234567890
printf轉義序列
轉義序列 | 描述 | ASCII 編碼 |
---|---|---|
\' | 單引號 | 0x27 |
\" | 雙引號 | 0x22 |
\? | 問號 | 0x3f |
\\ | 反斜槓 | 0x5c |
\a | 鈴聲(提醒) | 0x07 |
\b | 退格 | 0x08 |
\f | 換頁 | 0x0c |
\n | 換行 | 0x0a |
\r | 回車 | 0x0d |
\t | 水平製表符 | 0x09 |
\v | 垂直製表符 | 0x0b |
#include <stdio.h> int main(void) { printf("This\nis\na\ntest\n\nShe said, \"How are you?\"\n"); return 0; } //程序運行結果: This is a test She said, "How are you?"
printf注意事項
printf函數返回值
printf打印較長字符串
有時printf 語句會很長,以至於不能在一行被放下,如果必須分割一個字符串,有以下三種方式可以選擇。需要注意的是,可以在字符串中使用 "\n" 換行符來表示換行字符,但是在字符串中不能通過回車鍵來產生實際的換行字符。
[3]
#include <stdio.h> int main() { //方式一:使用多個printf語句 printf("Here's one way to print a "); printf("long string.\n"); //方式二:使用反斜槓 "\" 加回車的組合來進行分割,注意下一行要從最左側開始,否則縮進會成為該字符串的一部分 printf("Here's another way to print a \ long string.\n"); //方式三:採用字符串連接的方法,中間不能有逗號,可以是空格或者回車 printf("Here's the newest way to print a " "long string.\n"); /* ANSI C */ return 0; } //程序運行結果: Here's one way to print a long string. Here's another way to print a long string. Here's the newest way to print a long string.
- 參考資料
-
- 1. (美)Brian W. Kernighan,(美)Dennis M. Ritchie著;徐寶文,李志譯.C程序設計語言[M].北京:機械工業出版社,2004:135-137
- 2. Escape sequences .cppreference.com[引用日期2020-04-20]
- 3. (美)Stephen Prata著;雲巔工作室譯.C Primer Plus 第5版 中文版[M].北京:人民郵電出版社,2005:67-78
- 4. printf, fprintf, sprintf, snprintf, printf_s, fprintf_s, sprintf_s, snprintf_s .cppreference.com[引用日期2020-04-20]
- 5. Format specification syntax: printf and wprintf functions .Microsoft Docs[引用日期2020-04-20]
- 6. printf, _printf_l, wprintf, _wprintf_l .Microsoft Docs[引用日期2020-04-20]
- 7. 王瑞慶.格式輸出函數printf的執行流程分析[J].信息技術,2007,31(5):134-136
- 8. 張菊.淺析C語言printf函數的功能及使用[J].中國科技信息,2012(10):111-111116