printf格式(shi)化輸出函數詳解(jie),并(bing)附帶(dai)最新典型案(an)例
時間:2018-06-14 來源:未知
printf函數(shu)(shu)是(shi)一個(ge)標準庫函數(shu)(shu),它(ta)的函數(shu)(shu)原型在頭文件(jian)(jian)“stdio.h”中。但作為一個(ge)特(te)例,不要求在使用(yong) printf 函數(shu)(shu)之前必須包含stdio.h文件(jian)(jian)。printf函數(shu)(shu)調用(yong)的一般形(xing)式為:
printf(“格(ge)式控制字符串(chuan)”, 輸出表列(lie))
其中(zhong)格(ge)式(shi)(shi)控制字符(fu)串(chuan)用于指定輸出格(ge)式(shi)(shi)。格(ge)式(shi)(shi)控制串(chuan)可由格(ge)式(shi)(shi)字符(fu)串(chuan)和(he)非格(ge)式(shi)(shi)字符(fu)串(chuan)兩(liang)種(zhong)組(zu)成。格(ge)式(shi)(shi)字符(fu)串(chuan)是以(yi)%開頭的字符(fu)串(chuan),在%后(hou)面(mian)跟有各種(zhong)格(ge)式(shi)(shi)字符(fu),以(yi)說(shuo)明輸出數據的類型(xing)、形式(shi)(shi)、長度、小(xiao)數位數等。如:
“%d”表(biao)示(shi)按十進制整型輸出;
“%ld”表示按十進制長(chang)整型輸(shu)出;
“%c”表示按字符型輸出等。
非格式(shi)字(zi)符(fu)串(chuan)原樣輸(shu)出,在(zai)顯(xian)示中起(qi)提示作用。輸(shu)出表列中給出了(le)各個輸(shu)出項,要求(qiu)格式(shi)字(zi)符(fu)串(chuan)和各輸(shu)出項在(zai)數量和類型上(shang)應(ying)該一一對應(ying)。
【例4-3】printf函數舉例
#include
int main(void){
int a=88,b=89;
printf("%d %d\n",a,b);
printf("%d,%d\n",a,b);
printf("%c,%c\n",a,b);
printf("a=%d,b=%d",a,b);
return 0;
}
本例中(zhong)四次(ci)輸(shu)(shu)出(chu)了(le)a、b的(de)值(zhi)(zhi),但由(you)于格(ge)(ge)式(shi)控(kong)(kong)制(zhi)串(chuan)(chuan)不同,輸(shu)(shu)出(chu)的(de)結(jie)果也不相同。第3行(xing)的(de)輸(shu)(shu)出(chu)語句(ju)格(ge)(ge)式(shi)控(kong)(kong)制(zhi)串(chuan)(chuan)中(zhong),兩格(ge)(ge)式(shi)串(chuan)(chuan)%d 之間(jian)加了(le)一(yi)個空(kong)格(ge)(ge)(非(fei)(fei)格(ge)(ge)式(shi)字(zi)符(fu)(fu)),所以輸(shu)(shu)出(chu)的(de)a、b值(zhi)(zhi)之間(jian)有一(yi)個空(kong)格(ge)(ge)。第4行(xing)的(de)printf語句(ju)格(ge)(ge)式(shi)控(kong)(kong)制(zhi)串(chuan)(chuan)中(zhong)加入的(de)是非(fei)(fei)格(ge)(ge)式(shi)字(zi)符(fu)(fu)逗號,因(yin)此輸(shu)(shu)出(chu)的(de)a、b值(zhi)(zhi)之間(jian)加了(le)一(yi)個逗號。第5行(xing)的(de)格(ge)(ge)式(shi)串(chuan)(chuan)要(yao)求按字(zi)符(fu)(fu)型輸(shu)(shu)出(chu)a、b值(zhi)(zhi)。第6行(xing)中(zhong)為了(le)提示輸(shu)(shu)出(chu)結(jie)果又增加了(le)非(fei)(fei)格(ge)(ge)式(shi)字(zi)符(fu)(fu)串(chuan)(chuan)。
格式字符串
在Turbo C中(zhong)格式字(zi)符串的一般(ban)形式為:
[標志(zhi)][輸出最(zui)小寬度(du)(du)][.精(jing)度(du)(du)][長度(du)(du)]類型。
其中方(fang)括號[]中的項(xiang)為可選項(xiang)。
各項的意義介紹如下。
1) 類型
類(lei)型字符用以表(biao)示輸出(chu)數(shu)據的(de)類(lei)型,其格(ge)式符和(he)意(yi)義如下表(biao)所示:
格式(shi)字符意義
d以十進制形(xing)式輸(shu)出帶符(fu)(fu)號整數(shu)(正數(shu)不輸(shu)出符(fu)(fu)號)
o以八進制形式輸出無符號整數(shu)(不輸出前(qian)綴0)
x,X以十(shi)六進制形式(shi)輸出(chu)無(wu)符號整(zheng)數(不輸出(chu)前綴Ox)
u以十進制形(xing)式輸出無(wu)符號整數
f以小數形式(shi)輸出單、雙精(jing)度實數
e,E以指數形式輸出(chu)單、雙精度實(shi)數
g,G以%f或%e中較短的輸(shu)出寬度(du)輸(shu)出單、雙精度(du)實(shi)數
c輸(shu)出單個字(zi)符
s輸出字符串
2) 標志
標志(zhi)字符為(wei) -、+、# 和空格四種,其意(yi)義(yi)下表所示:
標 志意義
-結果左對齊,右邊填空格(ge)
+輸出符(fu)號(hao)(正號(hao)或負號(hao))
空格輸出值為(wei)正(zheng)時冠(guan)以空格,為(wei)負時冠(guan)以負號(hao)
#對c、s、d、u類無影響;
對o類,在輸出時加前綴o;
對x類,在輸(shu)出時加前綴0x;
對e、g、f 類(lei)當(dang)結(jie)果(guo)有小數時才(cai)給出小數點。
3) 輸出最小(xiao)寬度
用十進(jin)制(zhi)整數(shu)(shu)(shu)來(lai)表示輸(shu)出的最少(shao)位(wei)數(shu)(shu)(shu)。若實際(ji)位(wei)數(shu)(shu)(shu)多于定(ding)義(yi)的寬度,則按(an)實際(ji)位(wei)數(shu)(shu)(shu)輸(shu)出,若實際(ji)位(wei)數(shu)(shu)(shu)少(shao)于定(ding)義(yi)的寬度則補以空格或0。
4) 精度
精(jing)度格式符(fu)以(yi)“.”開頭,后跟十進制整數。本項(xiang)的(de)意義是(shi)(shi):如果輸出(chu)數字(zi),則(ze)表示(shi)小(xiao)數的(de)位數;如果輸出(chu)的(de)是(shi)(shi)字(zi)符(fu),則(ze)表示(shi)輸出(chu)字(zi)符(fu)的(de)個數;若實際位數大于(yu)所定義的(de)精(jing)度數,則(ze)截去超(chao)過的(de)部分(fen)。
5) 長度
長度格(ge)式符為h、l兩種,h表(biao)示(shi)按短整(zheng)型量輸出,l表(biao)示(shi)按長整(zheng)型量輸出。
【例4-4】
#include
int main(void){
int a=15;
long float b=123.1234567;
// 原來b的定義(yi)為 float b=123.1234567;
double c=12345678.1234567;
char d='p';
printf("a=%d\n", a);
printf("a(%%d)=%d, a(%%5d)=%5d, a(%%o)=%o, a(%%x)=%x\n\n",a,a,a,a); // %% 可以輸出 %
printf("a=%f\n", b);
printf("b(%%f)=%f, b(%%lf)=%lf, b(%%5.4lf)=%5.4lf, b(%%e)=%e\n\n",b,b,b,b);
printf("c=%f\n", c);
printf("c(%%lf)=%lf, c(%%f)=%f, c(%%8.4lf)=%8.4lf\n\n",c,c,c);
printf("d=%c\n", d);
printf("d(%%c)=%c, d(%%8c)=%8c\n",d,d);
return 0;
}
運行結果:
本例中:
第11行以四種格式輸出整型變量a的值,其中“%5d ”要求(qiu)輸出寬度為5,而a值為15只有兩位故補三個空格。
第14行(xing)以四種格式輸(shu)出實(shi)型(xing)量b的值。其中“%f”和“%lf ”格式的輸(shu)出相同,說(shuo)明“l”符(fu)對“f”類型(xing)無影響。“%5.4lf”指定(ding)輸(shu)出寬度(du)為5,精度(du)為4,由于實(shi)際(ji)長度(du)超過5故應該(gai)按(an)實(shi)際(ji)位數輸(shu)出,小數位數超過4位部分(fen)被(bei)截去。
第(di)17行輸出(chu)雙精度實數,“%8.4lf ”由于指定精度為4位故截去(qu)了超過4位的部分。
第20行輸(shu)(shu)出(chu)字符(fu)量d,其中“%8c ”指(zhi)定輸(shu)(shu)出(chu)寬(kuan)度(du)為8故(gu)在(zai)輸(shu)(shu)出(chu)字符(fu)p之(zhi)前補加7個(ge)空格。
使用printf函數時還要注(zhu)意一個(ge)問(wen)題,那就是輸出表列中的(de)求值順(shun)序(xu)。不同的(de)編譯(yi)系統不一定相同,可(ke)以從(cong)左到(dao)右,也可(ke)從(cong)右到(dao)左。Turbo C是按從(cong)右到(dao)左進行的(de)。請看下面兩個(ge)例子。
【例4-5】在一個printf()里輸出(chu)
#include
int main(void){
int i=8;
printf("The raw value: i=%d\n", i);
printf("++i=%d \n++i=%d \n--i=%d \n--i=%d\n",++i,++i,--i,--i);
return 0;
}
運行結果:
The raw value: i=8
++i=8
++i=7
--i=6
--i=7
【例4-6】在多個printf()里(li)輸出
#include
int main(void){
int i=8;
printf("The raw value: i=%d\n", i);
printf("++i=%d\n", ++i);
printf("++i=%d\n", ++i);
printf("--i=%d\n", --i);
printf("--i=%d\n", --i);
return 0;
}
運行結果:

The raw value: i=8
++i=9
++i=10
--i=9
--i=8
這兩個(ge)程(cheng)序的區(qu)別是(shi)用一個(ge)printf語句和多個(ge)printf 語句輸出(chu)(chu)。但從結果可(ke)以(yi)看出(chu)(chu)是(shi)不同(tong)的。為什(shen)么結果會不同(tong)呢?就是(shi)因為printf函數(shu)對輸出(chu)(chu)表中各量求值的順序是(shi)自右至(zhi)左進行(xing)的。
但(dan)是(shi)必(bi)須注意,求值順序雖(sui)是(shi)自右(you)至左,但(dan)是(shi)輸(shu)出順序還是(shi)從左至右(you),因此(ci)得到的結(jie)果是(shi)上述輸(shu)出結(jie)果。
下(xia)面是老代碼(ma)及(ji)分析:
【例4-5】
main(){
int i=8;
printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,i--,-i++,-i--);
}
【例4-6】
main(){
int i=8;
printf("%d\n",++i);
printf("%d\n",--i);
printf("%d\n",i++);
printf("%d\n",i--);
printf("%d\n",-i++);
printf("%d\n",-i--);
}
這兩(liang)個程序的區別是(shi)(shi)用一個printf語句和(he)多個printf 語句輸(shu)出(chu)。但從結果可(ke)以看出(chu)是(shi)(shi)不(bu)同(tong)的。為什么結果會不(bu)同(tong)呢?就是(shi)(shi)因為printf函數對(dui)輸(shu)出(chu)表中各量求值(zhi)的順序是(shi)(shi)自(zi)右至左進行的。在第(di)一例中,先對(dui)最后(hou)一項(xiang)“-i--”求值(zhi),結果為-8,然(ran)(ran)后(hou)i自(zi)減(jian)1后(hou)為7。 再(zai)對(dui)“-i++”項(xiang)求值(zhi)得-7,然(ran)(ran)后(hou)i自(zi)增(zeng)(zeng)(zeng)1后(hou)為8。再(zai)對(dui)“i--”項(xiang)求值(zhi)得8,然(ran)(ran)后(hou)i再(zai)自(zi)減(jian)1后(hou)為7。再(zai)求“i++”項(xiang)得7,然(ran)(ran)后(hou)i再(zai)自(zi)增(zeng)(zeng)(zeng)1后(hou)為8。 再(zai)求“--i”項(xiang),i先自(zi)減(jian)1后(hou)輸(shu)出(chu),輸(shu)出(chu)值(zhi)為7。 最后(hou)才求輸(shu)出(chu)表列中的第(di)一項(xiang)“++i”,此(ci)時(shi)i自(zi)增(zeng)(zeng)(zeng)1后(hou)輸(shu)出(chu)8。

