C中格式字符串的一般形式為: %[標(biāo)志][輸出最小寬度][.精度][長度]類型,, 其中方括號(hào)[]中的項(xiàng)為可選項(xiàng),。各項(xiàng)的意義介紹如下:
1.類型類型字符用以表示輸出數(shù)據(jù)的類型,其格式符和意義下表所示:
表示輸出類型的格式字符 格式字符意義
a 浮點(diǎn)數(shù)、十六進(jìn)制數(shù)字和p-計(jì)數(shù)法(C99)
A 浮點(diǎn)數(shù)、十六進(jìn)制數(shù)字和p-計(jì)數(shù)法(C99)
c 輸出單個(gè)字符
d 以十進(jìn)制形式輸出帶符號(hào)整數(shù)(正數(shù)不輸出符號(hào))
e 以指數(shù)形式輸出單、雙精度實(shí)數(shù)
E 以指數(shù)形式輸出單,、雙精度實(shí)數(shù)
f 以小數(shù)形式輸出單、雙精度實(shí)數(shù)
g 以%f%e中較短的輸出寬度輸出單,、雙精度實(shí)數(shù),%e格式在指數(shù)小于-4或者大 于等于精度時(shí)使用
G 以%f%e中較短的輸出寬度輸出單,、雙精度實(shí)數(shù),%e格式在指數(shù)小于-4或者大于等于精度時(shí)使用
i 有符號(hào)十進(jìn)制整數(shù)(與%d相同)
o 以八進(jìn)制形式輸出無符號(hào)整數(shù)(不輸出前綴O)
p 指針
s 輸出字符串
x 以十六進(jìn)制形式輸出無符號(hào)整數(shù)(不輸出前綴OX)
X 以十六進(jìn)制形式輸出無符號(hào)整數(shù)(不輸出前綴OX)
u 以十進(jìn)制形式輸出無符號(hào)整數(shù)
/* 測(cè)試常見的輸出類型 */
#include "stdio.h"
#include "conio.h"
main()
{
printf("The program test print style!\n");
/* 以十進(jìn)制形式輸出帶符號(hào)整數(shù)(正數(shù)不輸出符號(hào)) */
printf("%d\n" , 223);
printf("%d\n" , -232);
printf("\n");
/* 以八進(jìn)制形式輸出無符號(hào)整數(shù)(不輸出前綴O) */
printf("%o\n" , 223);
printf("%o\n" , -232);
printf("\n");
/* 以十六進(jìn)制形式輸出無符號(hào)整數(shù)(不輸出前綴OX) */
printf("%x\n" , 223);
printf("%x\n" , -232);
printf("\n");
/* 以十進(jìn)制形式輸出無符號(hào)整數(shù) */
printf("%u\n" , 223);
printf("%u\n" , -232);
printf("\n");
/* 以小數(shù)形式輸出單、雙精度實(shí)數(shù) */
printf("%f\n" , 223.11);
printf("%f\n" , 232.11111111);
printf("%f\n" , -223.11);
printf("%f\n" , -232.11111111);
printf("\n");
/* 以指數(shù)形式輸出單,、雙精度實(shí)數(shù) */
printf("%e\n" , 223.11);
printf("%e\n" , 232.11111111);
printf("%e\n" , -223.11);
printf("%e\n" , -232.11111111);
printf("\n");
/* 以%f%e中較短的輸出寬度輸出單,、雙精度實(shí)數(shù) */
printf("%g\n" , 223.11);
printf("%g\n" , 232.111111111111);
printf("%g\n" , -223.11);
printf("%g\n" , -232.111111111111);
printf("\n");
/* 輸出單個(gè)字符 */
printf("%c\n" , 'a');
printf("%c\n" , 97);
printf("\n");
/* 輸出單個(gè)字符 */
printf("%s\n" , "this is a test!");
printf("%s\n" , "2342o34uo23u");
printf("\n");
getch();
}
2.標(biāo)志
標(biāo)志字符為-、+,、#,、空格和0五種,其意義下表所示:
標(biāo)志格式字符 標(biāo) 志 意 義
- 結(jié)果左對(duì)齊,,右邊填空格
+ 輸出符號(hào)(正號(hào)或負(fù)號(hào))
空格 輸出值為正時(shí)冠以空格,,為負(fù)時(shí)冠以負(fù)號(hào)
# 對(duì)c,,s,d,,u類無影響,;對(duì)o類,在輸出時(shí)加前綴0,;對(duì)x類,,
在輸出時(shí)加前綴0x或者0X;對(duì)g,,G 類防止尾隨0被刪除,;
對(duì)于所有的浮點(diǎn)形式,,#保證了即使不跟任何數(shù)字,,也打印一個(gè)小數(shù)點(diǎn)字符
0 對(duì)于所有的數(shù)字格式,用前導(dǎo)0填充字段寬度,,若出現(xiàn)-標(biāo)志或者指定了精度(對(duì)于整數(shù)),忽略
3.輸出最小寬度
用十進(jìn)制整數(shù)來表示輸出的最少位數(shù),。若實(shí)際位數(shù)多于定義的寬度,則按實(shí)際位數(shù)輸出,,若實(shí)際位數(shù)少于定義的寬度則補(bǔ)以空格或0,。
/* 測(cè)試標(biāo)志字符為-、+,、#,、空格四種 */
#include "stdio.h"
#include "conio.h"
main()
{
/* 以十進(jìn)制形式輸出帶符號(hào)整數(shù)(正數(shù)不輸出符號(hào)) */
printf("*%-10d*\n", 223);
printf("*%+10d*\n" , -232);
printf("*%2d*\n" , 223);
printf("*%#d*\n" , -232);
printf("\n");
getch();
/* 以八進(jìn)制形式輸出無符號(hào)整數(shù)(不輸出前綴O) */
printf("*%-10o*\n" , 223);
printf("*%+10o*\n" , -232);
printf("*%o*\n" , 223);
printf("*%#o*\n" , -232);
printf("\n");
getch();
/* 以十六進(jìn)制形式輸出無符號(hào)整數(shù)(不輸出前綴OX) */
printf("$%-10x$\n" , 223);
printf("$%010x$\n" , -232);
printf("$% x$\n" , 223);
printf("$%#x$\n" , -232);
printf("\n");
/* 以十進(jìn)制形式輸出無符號(hào)整數(shù) */
printf("%-10u\n" , 223);
printf("%+10u\n" , -232);
printf("% u\n" , 223);
printf("%#u\n" , -232);
printf("\n");
getch();
/* 以小數(shù)形式輸出單、雙精度實(shí)數(shù) */
printf("%-10f\n" , 223.11);
printf("%+10f\n" , 232.11111111);
printf("% f\n" , -223.11);
printf("%#f\n" , -232.11111111);
printf("\n");
getch();
/* 以指數(shù)形式輸出單,、雙精度實(shí)數(shù) */
printf("%-10e\n" , 223.11);
printf("%+10e\n" , 232.11111111);
printf("% e\n" , -223.11);
printf("%#e\n" , -232.11111111);
printf("\n");
getch();
/* 以%f%e中較短的輸出寬度輸出單,、雙精度實(shí)數(shù) */
printf("%-10g\n" , 223.11);
printf("%+10g\n" , 232.111111111111);
printf("% g\n" , -223.11);
printf("%#g\n" , -232.111111111111);
printf("\n");
getch();
/* 輸出單個(gè)字符 */
printf("%-10c\n" , 'a');
printf("%+10c\n" , 97);
printf("% c\n" , 'a');
printf("%#c\n" , 97);
printf("\n");
getch();
/* 輸出單個(gè)字符 */
printf("%-20s\n" , "this is a test!");
printf("%+20s\n" , "2342o34uo23u");
printf("% 20s\n" , "this is a test!");/* 不足補(bǔ)空格 */
printf("%#s\n" , "2342o34uo23u");
printf("\n");
getch();
}
4.精度
精度格式符以“.”開頭,后跟十進(jìn)制整數(shù),。本項(xiàng)的意義是:如果輸出數(shù)字,,則表示小數(shù)的位數(shù);如果輸出的是字符,,則表示輸出字符的個(gè)數(shù),;若實(shí)際位數(shù)大于所定義的精度數(shù),則截去超過的部分,。
/* 測(cè)試精度 */
#include "stdio.h"
#include "conio.h"
main()
{
printf("%.3d\n" , 5555);
getch();
printf("%.3f\n" , 0.88888);
getch();
printf("%.3f\n" , 0.9999);
getch();
printf("%.4s\n" , "this is a test!");
getch();
}
5.長度
長度格式符為h,l兩種,,h表示按短整型量輸出,l表示按長整型量輸出,。
h和整數(shù)轉(zhuǎn)換說明符一起使用,,表示一個(gè)short int 或者unsigned short int類型的數(shù)值 ,示例:
%hu,,%hx,,%6.4hd
hh和整數(shù)轉(zhuǎn)換說明符一起使用,表示一個(gè)short int 或者unsigned short類型的數(shù)值 ,示例:
%hhu,,%hhx,,%6.4hhd
j和整數(shù)轉(zhuǎn)換說明符一起使用,表示一個(gè)intmax_t或者uintmax_t類型的數(shù)值 ,,示例:
%jd,%8jx
l和整數(shù)轉(zhuǎn)換說明符一起使用,,表示一個(gè)long int 或者unsigned long int類型的數(shù)值 ,示例:
%ld,%8lu
ll和整數(shù)轉(zhuǎn)換說明符一起使用,,表示一個(gè)long int 或者unsigned long int類型的數(shù)值 (C99),,示例:
%lld,%8llu
L和浮點(diǎn)轉(zhuǎn)換說明符一起使用,表示一個(gè)long double的值,,示例:%Lf,,%10.4Le
t和整數(shù)轉(zhuǎn)換說明符一起使用,表示一個(gè)ptrdiff_t值(兩個(gè)指針之間的差相對(duì)應(yīng)的類型)(C99),,示例:
%td,%12ti
z和整數(shù)轉(zhuǎn)換說明符一起使用,,表示一個(gè)size_t值(sizeof返回的類型)(C99),示例:%zd,%12zx
main(){
int a=15;
float b=138.3576278;
double c=35648256.3645687;
char d='p';
printf("a=%d,%5d,%o,%x\n",a,a,a,a);
printf("b=%f,%lf,%5.4lf,%e\n",b,b,b,b);
printf("c=%lf,%f,%8.4lf\n",c,c,c);
printf("d=%c,%8c\n",d,d);
}
a<--15
b<--138.3576278
c<--35648256.3645687
d<--'p'
main()
{
int a=29;
float b=1243.2341;
double c=24212345.24232;
char d='h';
printf("a=%d,%5d,%o,%x\n",a,a,a,a);
/* 其中“%f”和“%lf ”格式的輸出相同,,說明“l”符對(duì)“f”類型無影響
* “%5.4lf”指定輸出寬度為5,,精度為4,由于實(shí)際長度超過5故應(yīng)該按實(shí)際位數(shù)輸出,,小數(shù)位數(shù)超過4位 * 部分被截去
*/
printf("b=%f,%lf,%5.4lf,%e\n",b,b,b,b);
/* 輸出雙精度實(shí)數(shù),,“%8.4lf ”由于指定精度為4位故截去了超過4位的部分 */
printf("c=%lf,%f,%8.4lf\n",c,c,c);
/* 輸出字符量d,其中“%8c ”指定輸出寬度為8故在輸出字符p之前補(bǔ)加7個(gè)空格 */
printf("d=%c,%8c\n",d,d);
getch();
}
使用printf函數(shù)時(shí)還要注意一個(gè)問題,,那就是輸出表列中的求值順序,。不同的編譯系統(tǒng)不一定相同,可以從左到右,,也可從右到左,。Turbo C是按從右到左進(jìn)行的
main(){
int i=8;
printf("%d\n%d\n%d\n%d\n%d\n",++i,--i,i--,i++,-i--);
}
6.特殊用法
對(duì)于m.n的格式還可以用如下方法表示(例)
char ch[20];
printf("%*.*s\n",m,n,ch);
前邊的*定義的是總的寬度,后邊的定義的是輸出的個(gè)數(shù),。分別對(duì)應(yīng)外面的參數(shù)m和n ,。我想這種方法的好處是可以在語句之外對(duì)參數(shù)m和n賦值,從而控制輸出格式,。
今天(06.6.9)又看到一種輸出格式 %n 可以將所輸出字符串的長度值賦紿一個(gè)變量, 見下例:
int slen;
printf("hello world%n", &slen);
執(zhí)行后變量被賦值為11,。
又查了一下, 看到一篇文章(
查看)說這種格式輸出已經(jīng)確認(rèn)為一個(gè)安全隱患,并且已禁用,。再搜搜果然這種用法都被用來搞什么溢出,、漏洞之類的,隨便找了一個(gè):
格式化字符串攻擊筆記特別注意下%*.*s這種用法