C中printf函數的用法總結

函數語法

stdio.h文件中的定義:函數

/* Write formatted output to stdout. */
int printf (const char *__restrict __format, ...)

做用:將格式化好的結果寫到標準輸出3d

有兩個參數:指針

第一個參數爲字符串類型的指針常量(只讀變量),表示須要輸出的格式。rest

第二個參數 "..." 表示被格式化的變量或常量,可爲多個值中間用 "," 隔開,每一個參數的值應當與前面格式化字符串中的佔位符類型和位置一一對應。code

返回值爲 int 類型,表示輸出的字節數orm

格式語法
%[flags][width][.precision][length]specifier
%[標誌][寬度][.精度][長度]類型
flags
標誌 含義
- 指定被轉換的參數在其字段內左對齊(默認爲右對齊)
+ 指定在輸出的數前面加上正負號
空格 若是第一個字符不是正負號,則在其前面加上一個空格
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
width

寬度是一個數值,用於指定最小字段的寬度,轉換後的參數輸出寬度至少要達到這個數值,若是參數的字符數小於該數值,則在參數左邊(若是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]" 或 "[.精度]",經過 "." 分隔字段的寬度和精度

說明:

  • 對於字符串,它指定打印的字符的最大個數
  • 對於整數,它指定打印的數字位數(必要時可加填充位 0 已達到寬度要求)
  • 對於轉換字符爲 e或E, f,它指定打印的小數點後的數字位數
  • 對於轉換字符爲 g或G,它指定打印的有效數字位數

下面經過示例說明

/* .精度(.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
length

長度,可選的值爲 h, hh, l, ll, L

  • hh 表示將相應的參數按 signed char 或 unsigned char 類型輸出
  • h 表示將相應的參數按 short 或 unsigned short 類型輸出
  • l 表示將相應的參數按 long 或 unsigned long 類型輸出
  • ll 表示將相應的參數按 long long 或 unsigned long long 類型輸出
  • L 表示將相應的參數按 long double 類型輸出

下面經過示例說明

/* 長度 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
specifier
轉換字符名 說明
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 十六進制所表明的任意字符 十六進制
標準ASCII表及其擴展表

相關文章
相關標籤/搜索