printf函數提供格式化輸出轉換
函數包含在頭文件 <stdio.h> 中
#include <stdio.h>
......
函數的原型在頭文件的聲明為
_CRTIMP __cdecl __MINGW_NOTHROW int printf (const char *, ...);
第一個參數 const char * 來指明輸出的格式 , 按照格式對輸出進行轉換, 並寫到標准輸出流中(stdin),后面的三個點 . . . 表示此處的參數是可變參數,這樣可以滿足不同的輸出需求
如果打印輸出成功函數返回打印的字節數(函數返回值為 int 類型), 如果出錯則返回一個負值
1 #include <stdio.h>
2
3 int main()
4 { 5 int i = printf("你好\n"); 6 printf("%d\n", i); 7 return 0; 8 }
輸出
你好
5
成功輸出 你好 並且返回打印的字符個數 5 (一個漢字的編碼占2個字節 * 2 + '\n'一個字節 = 5)
格式串由兩種類型對象組成:
----- 普通字符(將被復制到輸出流中)
----- 轉換說明(分別決定下一個后續參數的轉換和打印), 每個轉換說明均以 % 開頭, 以轉換字符結束, 在%與轉換字符之間可以一次包括下列內容
- 標志
- 指定被轉換的參數在其字段內左對齊
1 #include <stdio.h> 2 3 int main() 4 { 5 printf("%20s\n", "hello world\n"); 6 printf("%-20s\n", "hello world\n"); 7 return 0; 8 }
輸出
hello world
hello world
+ 只定在輸出的數前面加上正負號
1 #include <stdio.h> 2 3 int main() 4 { 5 int i = printf("%20s\n", "hello world\n"); 6 printf("%d\n", i); 7 printf("%+d\n", i); 8 printf("%+d\n", -i); 9 return 0; 10 }
輸出
hello world 21 +21 -21
空格 如果第一個字符不是正負號, 則在它的前面加上空格
1 #include <stdio.h> 2 3 int main() 4 { 5 int i = printf("%20s\n", "hello world\n"); 6 printf("%d\n", i); 7 printf("%+d\n", i); 8 printf("%+d\n", -i); 9 printf("%+ d\n", -i); 10 printf("% d\n", i); 11 return 0; 12 }
輸出
hello world 21 +21 -21 -21 21
0 對於數制轉換, 當輸出長度小於字段寬度時, 在前面添加 0 作為填充
1 #include <stdio.h> 2 3 int main() 4 { 5 int i = printf("%20s\n", "hello world\n"); 6 printf("%06d\n", i); 7 return 0; 8 }
輸出
hello world
000021
# 指定另一種輸出格式。 如果為 o 則第一個數字為0(表示八進制), 如果為 x 或 X , 則指定在輸出的非0值前加 0x 或 0X (表示十六進制)
1 #include <stdio.h> 2 3 int main() 4 { 5 int i = printf("你好!!!\n"); 6 printf("%#o\n", i); 7 return 0; 8 }
輸出
你好!!!
010
共 8 個字節, 八進制是 010
1 #include <stdio.h> 2 3 int main() 4 { 5 int i = printf("!!!!!!你好!!!!!\n"); 6 printf("%#x\n", i); 7 printf("%#X\n", i); 8 return 0; 9 }
輸出
!!!!!!你好!!!!!
0x10
0X10
共 16 個字節, 十六進制是 0x10
- 一個數值, 用於指定最小字段寬度
1 #include <stdio.h> 2 3 int main() 4 { 5 printf("%d\n", 8); 6 printf("%d\n", 9); 7 printf("%d\n", 10); 8 printf("%6d\n", 8); 9 printf("%6d\n", 9); 10 printf("%6d\n", 10); 11 return 0; 12 }
輸出
8 9 10 8 9 10
當然這里默認是右對齊的
- 點號,用於分隔字段寬度和精度
- 表示精度的數
1 #include <stdio.h> 2 #define PI 3.1415926535897932384626433832795028841971693993751058209 3 int main() 4 { 5 printf("%30.20f\n", PI); 6 }
輸出
3.14159265358979310000
可以看出雙精度浮點型可以精確到小數點后 16 位左右
------------------- 寬度和精度中任何一個或者兩個都可以用 * 代替, 通過轉換下一個參數計算得到(下一個參數必須為 int 類型)
1 #include <stdio.h> 2 #define PI 3.1415926535897932384626433832795028841971693993751058209 3 int main() 4 { 5 int a = 30, b = 20; 6 printf("%*.*f\n", a, b, PI); 7 }
當然結果和上面一樣
- 長度修飾符 h , l 或 L 。
h:將相應的參數按照 short 或 unsigned short 類型輸出
l:將相應的參數按照 long 或 unsigned long 類型輸出
L:將相應的參數按照 long double 類型輸出
printf 函數的轉換字符(以 % 開頭, 如果 % 后面的字符不是轉換字符, 則它行為沒有定義)
轉換字符 | 參數類型, 轉換結果 |
d, i | int, 有符號十進制表示 |
o | unsigned int, 無符號八進制表示(無前導0) |
x, X | unsigned int, 無符號十六進制表示(無前導0x和0X)。如果是0x, 則使用abcdef, 如果是0X, 則使用ABCDEF |
u | int, 無符號十進制表示 |
c | int, 轉換為unsigned char類型后為一個字符 |
s | char *, 打印字符串中的字符, 知道遇到 '\0' 或者已經打印了有精度指定的字符數 |
f | double, 形式為 [-]mmm.ddd 的十進制表示, 其中, d的數目由精度確定, 默認精度為6, 精度為0時不輸出小數點 |
e, E | double, 形式為 [-]m.dddddd e (+/-) xx 或 [-]m.dddddd E (+/-) xx 的十六進制表示, d的數目由精度確定, 默認為6, 精度為0時不輸出小數點 |
g, G | double, 當指數小於 -4 或大於等於精度時, 采用 %e 或 %E 的格式, 否則采用 %f 的格式, 尾部的0與小數點不打印 |
p | void *, 打印指針值(具體表示方式與實現有關) |
n | int *, 到目前為止, 此printf調用輸出的字符的數目將被寫入到相應參數中, 不進行參數轉換 |
% | 不進行參數轉換, 打印一個符號 % |