stdio.h文件中的定義:函數
/* Write formatted output to stdout. */ int printf (const char *__restrict __format, ...)
做用:將格式化好的結果寫到標準輸出3d
有兩個參數:指針
第一個參數爲字符串類型的指針常量(只讀變量),表示須要輸出的格式。rest
第二個參數 "..." 表示被格式化的變量或常量,可爲多個值中間用 "," 隔開,每一個參數的值應當與前面格式化字符串中的佔位符類型和位置一一對應。code
返回值爲 int 類型,表示輸出的字節數orm
%[flags][width][.precision][length]specifier %[標誌][寬度][.精度][長度]類型
標誌 | 含義 |
---|---|
- | 指定被轉換的參數在其字段內左對齊(默認爲右對齊) |
+ | 指定在輸出的數前面加上正負號 |
空格 | 若是第一個字符不是正負號,則在其前面加上一個空格 |
0 | 對於數值轉換,當輸出長度小於字段寬度時,添加前導0進行填充 |
# | 指定另外一種輸出形式: |
1. 若是轉換字符爲 o,則第一個數字爲 0 | |
2. 若是轉換字符爲 x 或 X,則指定在輸出的非 0 值前加 0x 或 0X | |
3. 對於轉字符爲 e, E, f, g, G 的狀況,指定輸出老是包含一個小數點, | |
另外對於轉換字符爲 g 或 G,還指定輸出值尾部無心義的 0 將被保留 |
注意:flags可同時出現多個,而且沒有順序要求blog
下面經過示例說明ci
'-'字符串
// - 指定被轉換的參數在其字段內左對齊(默認爲右對齊) short a = 1; // 將變量a按照10個字符的寬度輸出, 默認爲右對齊 // 右對齊 printf("%10d\n", a); // 加上 "-" 後, 左對齊 printf("%-10d\n", a);
輸出it
1 1
'+'
// + 指定在輸出的數前面加上正負號 short b = 1; printf("%d\n", b); // b的值爲1, 會將b的值前面隱藏的加號強制顯示, 輸出 +1 printf("%+d\n", b); // -b的值爲-1, 原樣輸出 -1 printf("%+d\n", -b);
輸出
1 +1 -1
空格
// 空格 若是第一個字符不是正負號,則在其前面加上一個空格 short d = -1; // d的第一個字符是負號, 原樣輸出-1 printf("% d\n", d); // -d的值爲1, 不帶正負號, 輸出 空格+1 printf("% d\n", -d);
輸出
-1 1
0
// 0 對於數值轉換,當輸出長度小於字段寬度時,添加前導0進行填充 // 1. 數字 short e = 1; // e的值爲1, 要求按照寬度爲5輸出, 不足的部分寬度內左邊補0 // 因此輸出 "00001" printf("%05d\n", e); // 2. 字符 char f = 'a'; // 將字符型變量f按照寬度爲5輸出, 不足的部分寬度內左邊 // 自動補空格, 因此輸出 " a" printf("%5c\n", f); // 3. 字符串 char *str = "blank"; // str的值爲字符串, 須要按照寬度爲10輸出 // 不足的部分寬度內左邊自動補空格, 因此 // 輸出 " blank" // 注意: 字符串的結束字符 '\0' 不包含在內 printf("%10s\n", str); // 4. 字符 '\0' char blk = '\0'; // 打印字符 '\0', 按字符格式會輸出 ''(空) // 按整型格式會輸出 "0" printf("%c, %d\n", blk, blk); char *blk2 = "hello\0"; // blk2的值包含字符 '\0', 以寬度爲10輸出 // 不足的部分寬度內自動補空格, 因此會輸出 // " hello", 輸出時 '\0' 沒有被顯示出來 printf("%10s\n", blk2); // 包含兩個 '\0', 輸出結果跟上面同樣 char *blk3 = "hello\0\0"; printf("%10s\n", blk3);
輸出
00001 a blank , 0 hello hello
'#'
// # 指定另外一種輸出形式(o, x或X, f, g或G, e或E) int g = 1000; // 依次按八進制, 十六進制格式輸出 printf("%#od, %#xd, %#Xd\n", g, g, g); // 將整數1e3, 1000按照科學計數法e, E整型格式輸出 printf("%#ed, %#Ed, %#ed\n", 1e3, 1e3, 1000); // 將浮點數1e-3, 0.001按照科學計數法e, E單精度類型格式輸出 printf("%#ef, %#Ef, %#ef\n", 1e-3, 1e-3, 0.001); // 將浮點數0.001按照單精度f單精度類型格式輸出 printf("%#ff\n", 0.001); // 將浮點數3.14按照雙精度g或G雙精度類型輸出 printf("%#gg, %#GG\n", 3.14, 3.14);
輸出
01750d, 0x3e8d, 0X3E8d 1.000000e+03d, 1.000000E+03d, 0.000000e+00d 1.000000e-03f, 1.000000E-03f, 1.000000e-03f 0.001000f 3.14000g, 3.14000G
寬度是一個數值,用於指定最小字段的寬度,轉換後的參數輸出寬度至少要達到這個數值,若是參數的字符數小於該數值,則在參數左邊(若是flags設置爲 "-",要求左對齊的話則在右邊)填充一些字符,填充字符一般爲空格,可是若是flags設置爲 0,則填充字符爲數字 0 。
/* 寬度(width) */ char *ur = "human"; // 直接原樣輸出 printf("%s\n", ur); // 以寬度爲10輸出, 同時寬度內右對齊, 左端補空格 printf("%10s\n", ur); // 以寬度爲10輸出, 同時寬度內左對齊, 右段補空格 printf("%-10s\n", ur); // 直接原樣輸出 printf("%d\n", 2); // 以寬度爲5輸出, 同時寬度內右對齊, 左端補空格 printf("%5d\n", 2); // 以寬度爲5輸出, 同時寬度內右對齊, 左端補0 printf("%05d\n", 2); // 以寬度爲5輸出, 同時寬度內左對齊, 右端補空格 printf("%-5d\n", 2); // 以寬度爲5輸出, 同時寬度內左對齊, 右端沒有補0, // 實際補的是空格, 最後輸出 "2 " printf("%-05d\n", 2);
輸出
human human human 2 2 00002 2 2
格式爲 "[.precision]" 或 "[.精度]",經過 "." 分隔字段的寬度和精度
說明:
下面經過示例說明
/* .精度(.precision) */ // 字符串 // 按最大3個字符輸出, 超出的部分會被截斷丟棄 printf("%.3s\n", "abcdefg"); // 按最大5個字符輸出, 小於最大字符個數不會補 // 空格也不會默認右對齊, 會原樣輸出 printf("%.5s\n", "abc"); // 按最大5個字符輸出, 小於最大字符個數不會補 // 空格也不會左對齊, 會原樣輸出 printf("%-.5s\n", "abc"); // 整數 // 按照整數3位輸出, 實際值是5位 // 大於3位, 會原樣輸出, 不會被截取 printf("%.3d\n", 10000); // 按照整數5位輸出, 實際值是3位 // 不夠的位數會從左端開始補0 printf("%.5d\n", 100); // e或E // 取小數點以後3位, 多出的部分被截取丟棄, 同時會四捨五入 printf("%.3e, %.3E\n", 1.99991, 1.99991); // 取小數點以後5位, 不夠的部分用0填充 printf("%.5e, %.5E\n", -1.01, -1.01); // f // 取小數點以後3位, 多出的部分被截取丟棄, 同時會四捨五入 printf("%.3f\n", 1.2689); // 取小數點以後5位, 不夠的部分用0填充 printf("%.5f\n", 1.26); // g或G // 按照3位數字位數輸出, 多出的部分被截取丟棄, 同時會四捨五入 // 3表明的是數字位數 printf("%.3g, %.3G\n", 2.888888, 2.888888); // 按照5位數字位數輸出, 不夠的部分不會補空格和0 // 5表明的是數字位數 printf("%.5g, %.5G\n", 2.88, 2.88);
輸出
abc abc abc 10000 00100 2.000e+00, 2.000E+00 -1.01000e+00, -1.01000E+00 1.269 1.26000 2.89, 2.89 2.88, 2.88
長度,可選的值爲 h, hh, l, ll, L
下面經過示例說明
/* 長度 length */ // hh signed char, unsigned char // 輸出 ascii 65 對應的 A printf("%hhc\n", '\x41'); printf("%hhc\n", -1); // h short, unsigned short printf("%hd, %hd\n", 1, -1); // l long, unsigned long printf("%ld, %ld\n", 1, -1); // ll long long, unsigned long long printf("%lld, %lld\n", 1, -1); // L long double printf("%Lg, %LG\n", 1, -1);
輸出
A ÿ 1, -1 1, 4294967295 1, 4294967295 -0, 5.12975E-4937
轉換字符名 | 說明 |
---|---|
c | char 字符類型 |
d | int 有符號十進制整數 |
i | int 有符號十進制整數 |
e | double 以指數形式輸出單精度,雙精度浮點數(小寫 e) |
E | double 以指數形式輸出單精度,雙精度浮點數(大寫 e) |
f | double 以小數形式輸出單精度,雙精度浮點數 |
g | double 以 %f 或 %e 中較短的輸出寬度輸出單精度,雙精度浮點數(指數顯示小寫e) |
G | double 以 %f 或 %e 中較短的輸出寬度輸出單精度,雙精度浮點數(指數顯示小寫E) |
o | unsigned int 無符號八進制整數(無前導 0) |
s | char * 字符串 |
u | unsigned int 無符號十進制整數 |
x | unsigned int 無符號十六進制整數(無前導 0x) |
X | unsigned int 無符號十六進制整數(無前導 0X) |
p | void * 指針值 |
n | int * 存放已寫字符的個數 |
% | 不進行參數轉換,顯示%自身 |
轉義字符 | 說明 | ASCII (十進制) |
---|---|---|
\a | 響鈴(BEL) | 7 |
\b | 退格(BS),將當前位置移到前一列 | 8 |
\f | 換頁(FF),將當前位置移到下頁開頭 | 12 |
\n | 換行(LF),將當前位置移到下一行開頭 | 10 |
\r | 回車(CR),將當前位置移到本行開頭 | 13 |
\t | 水平製表(HT),(跳到下一個TAB位置) | 9 |
\v | 垂直製表(VT) | 11 |
\ | 表明一個反斜槓字符 | 92 |
' | 表明一個單引號字符 | 39 |
'' | 表明一個雙引號字符 | 34 |
? | 表明一個問號 | 63 |
\0 | 空字符(NUL) | 0 |
\ddd | 1到3位八進制數所表明的任意字符 | 三位八進制 |
\xhh | 十六進制所表明的任意字符 | 十六進制 |