c中格式字串的一般形式為: %[標誌][輸出最小寬度][.精度][長度]型別, 其中方括號中的項為可選項。各項的意義介紹如下:
1.型別型別字元用以表示輸出資料的型別,其格式符和意義下表所示:
表示輸出型別的格式字元
格式字元意義
%a 浮點數、十六進製制數字和p-計數法(c99)
%a 浮點數、十六進製制數字和p-計數法(c99)
%c 輸出單個字元
%d 以十進位制形式輸出帶符號整數(正數不輸出符號)
%e 以指數形式輸出單、雙精度實數
%e 以指數形式輸出單、雙精度實數
%f 以小數形式輸出單、雙精度實數
%g 以%f%e中較短的輸出寬度輸出單.雙精度實數,%e格式在指數小於-4或者大於等於精度時使用
%g 以%f%e中較短的輸出寬度輸出單.雙精度實數,%e格式在指數小於-4或者大於等於精度時使用
%i 有符號十進位制整數(與%d相同)
%o 以八進位制形式輸出無符號整數(不輸出字首o)
%p 指標
%s 輸出字串
%x 以十六進製制形式輸出無符號整數(不輸出字首ox)
%x 以十六進製制形式輸出無符號整數(不輸出字首ox)
%u 以十進位制形式輸出無符號整數
/* 測試常見的輸出型別 */
#include "stdio.h"
#include "conio.h"
main()
2.標誌
標誌字元為-、+、#、空格和0五種,其意義下表所示:
標誌格式字元 標 志 意 義
- 結果左對齊,右邊填空格
+ 輸出符號(正號或負號)
空格 輸出值為正時冠以空格,為負時冠以負號
# 對c,s,d,u類無影響;對o類,在輸出時加字首0;對x類,
在輸出時加字首0x或者0x;對g,g 類防止尾隨0被刪除;
對於所有的浮點形式,#保證了即使不跟任何數字,也列印乙個小數點字元
0 對於所有的數字格式,用前導0填充字段寬度,若出現-標誌或者指定了精度(對於整數),忽略
3.輸出最小寬度
用十進位制整數來表示輸出的最少位數。若實際位數多於定義的寬度,則按實際位數輸出,若實際位數少於定義的寬度則補以空格或0。
/* 測試標誌字元為-、+、#、空格四種 */
#include "stdio.h"
#include "conio.h"
main()
4.精度
精度格式符以「.」開頭,後跟十進位制整數。本項的意義是:如果輸出數字,則表示小數的位數;如果輸出的是字元,則表示輸出字元的個數;若實際位數大於所定義的精度數,則截去超過的部分。
/* 測試精度 */
#include "stdio.h"
#include "conio.h"
main()
5.長度
長度格式符為h,l兩種,h表示按短整型量輸出,l表示按長整型量輸出。
h和整數轉換說明符一起使用,表示乙個short int 或者unsigned short int
型別的數值 ,示例:
%hu,%hx,%6.4hd
hh和整數轉換說明符一起使用,表示乙個short int 或者unsigned short型別的數值 ,示例:
%hhu,%hhx,%6.4hhd
j和整數轉換說明符一起使用,表示乙個intmax_t或者uintmax_t型別的數值 ,示例:
%jd,%8jx
l和整數轉換說明符一起使用,表示乙個long
int 或者unsigned long int型別的數值 ,示例:
%ld,%8lu
ll和整數轉換說明符一起使用,表示乙個longint 或者unsigned long int型別的數值 (c99),示例:
%lld,%8llu
l和浮點轉換說明符一起使用,表示乙個long double的值,示例:%lf,%10.4le
t和整數轉換說明符一起使用,表示乙個ptrdiff_t值(兩個指標之間的差相對應的型別)(c99),示例:
%td,%12ti
z和整數轉換說明符一起使用,表示乙個size_t值(sizeof返回的型別)(c99),示例:%zd,%12zx
main()
a<--15
b<--138.3576278
c<--35648256.3645687
d<--'p'
main()
使用printf函式時還要注意乙個問題,那就是輸出表列中的求值順序。不同的編譯系統不一定相同,可以從左到右,也可從右到左。turbo c是按從右到左進行的
main()
6.特殊用法
對於m.n的格式還可以用如下方法表示(例)
char ch[20];
printf("%*.*s/n",m,n,ch);
前邊的*定義的是總的寬度,後邊的定義的是輸出的個數。分別對應外面的引數m和n 。我想這種方法的好處是可以在語句之外對引數m和n賦值,從而控制輸出格式。
今天(06.6.9)又看到一種輸出格式 %n 可以將所輸出字串的長度值賦紿乙個變數, 見下例:
int slen;
printf("hello world%n", &slen);
執行後變數被賦值為11。
又查了一下, 看到一篇文章(檢視
)說這種格式輸出已經確認為乙個安全隱患,並且已禁用。再搜搜果然這種用法都被用來搞什麼溢位、漏洞之類的,隨便找了乙個:格式化字串攻擊筆記
特別注意下%*.*s這種用法
C語言中printf格式
轉換說明及作為結果的列印輸出 a 浮點數 十六進製制數字和p 記數法 c99 a 浮點數 十六進製制數字和p 記法 c99 c 乙個字元 d 有符號十進位制整數 e 浮點數 e 記數法 e 浮點數 e 記數法 f 浮點數 十進位制記數法 g 根據數值不同自動選擇 f或 e g 根據數值不同自動選擇 ...
C語言中的printf函式
c語言中的 g是printf 函式的乙個輸出格式化型別,它表示以 f e中較短的輸出寬度 輸出單雙精度實數,在指數小於 4或者大於等於精度時使用 e格式 02g 02表示不足兩位,前面補0輸出 超過兩位的不影響 root localhost seq printf 02x n 0x123 123 ro...
C語言中的printf函式
includevoid main printf的作用是輸出資訊 d對應的引數值是int型別 visitor count是按指定格式顯示變數的值 d 將引數按整形形式轉換輸出,對應的引數是int ld 將引數按長整型形式轉換輸出,對應的引數是long c 輸出乙個字元,對應的引數是乙個字元 s 輸出乙...