- C程序設計語言
- 魏東平 朱連章 于廣斌編著
- 2566字
- 2018-12-29 14:37:41
3.3.2 數據的輸出函數
1.putchar函數
該函數是字符輸出函數,其功能是在標準輸出設備(顯示器)上輸出單個字符。其一般形式為:
putchar(整型表達式)
其中,“整型表達式”的值為要輸出的字符的編碼。通常,該表達式直接用字符型表達式代替。
例如:
putchar('A'); 輸出大寫字母A。
putchar(x); 輸出整型(或字符型)變量x的值。
putchar('\n'); 輸出換行符,實際就是實現換行操作,并不顯示任何字符。
putchar('\101'); 輸出大寫字母A。
putchar(65); 輸出大寫字母A。
putchar('a'-32); 輸出大寫字母A。
使用該函數前必須要用文件包含命令:#include<stdio.h>或#include "stdio.h"。
【例3.1】 putchar函數的使用方法。
源程序如下:
1 #include <stdio.h> 2 void main() 3 { 4 char a='B',b='o',c='k'; 5 putchar(a);putchar(b);putchar(b);putchar(c); 6 putchar('\n'); 7 putchar(b);putchar(c); 8 putchar('\n'); 9 }
程序的運行結果為:
Book ok
在這個程序中,第1行是預編譯命令,將頭文件“stdio.h”加入進來。第2~9行是主函數main函數的完整定義,第2行的void表示函數的類型為空類型。第4行定義了3個字符型變量a、b、c,并分別進行了初始化。第5行是用putchar函數輸出相應變量的值,即運行結果的第1行。第6行輸出一個換行符,表示后面的輸出將另起一行進行輸出。第7行同樣是用putchar函數輸出相應變量的值,即運行結果的第2行。第8行的作用與第6行一樣。
可見,用putchar函數輸出一串字符時很不方便,需要寫許多putchar。通常,該函數只用于輸出單一字符,若要輸出一個字符串,可以使用printf函數(見3.3.3節)或puts函數(見第8章)。
2.printf函數
(1)函數的調用方法
printf函數的一般形式為:
printf(格式控制,輸出表列);
其中,“格式控制”部分是由雙引號括起來的字符串,也稱“轉換控制字符串”,是不可缺少的部分,其功能是控制“輸出表列”中的輸出項的格式,即在顯示器上輸出的具體內容。“格式控制”字符串包括兩種信息:格式說明和普通字符,如圖3.1所示。“格式說明”(這里為“%d”)由引導符(百分號“%”)和格式字符(字母“d”)組成,而且總是由“%”開始的,其作用是控制待輸出的數據按指定的格式輸出。“普通字符”(這里指“a=”)是“格式控制”中除了“格式說明”外的那些字符,它們按原樣輸出。

圖3.1 printf函數的一般形式
“輸出表列”由0到多個具體參數組成,參數可以是常量、變量、表達式等,參數的個數應該與“格式控制”字符串中“格式說明”的個數一致。
對于圖3.1中的輸出語句,如果假設整型變量a的值為10(應在執行該語句前給變量a賦值),則其輸出為:
a=10
這里的“a=”來自于“格式控制”字符串,是“普通字符”,按原樣輸出。“10”是輸出表列中參數a的值,其輸出格式由格式說明“%d”指定。
由于“格式控制”和“輸出表列”實際上都是printf函數的參數,因此,printf函數的一般形式還可以表示為:
printf(參數1,參數2,參數3,……,參數n);
其功能是將“參數2”~“參數n”按“參數1”指定的格式輸出。“參數2”~“參數n”的輸出格式依次由“參數1”中的“格式說明”決定。
例如:
printf("%d%f%c",a,b,c);
的執行結果為:a按%d的格式輸出,b按%f的格式輸出,c按%c的格式輸出。
在printf函數的參數中,只有第一個參數“參數1”是必要的,其他參數可以省略。當只有一個參數時,“參數1”中不能包含“格式說明”字符,只能有“普通字符”。例如,
printf("This is a C program.\n");
是合法的,但
printf("a=%d\n");
是錯誤的(程序運行時將輸出錯誤的結果,但不是語法錯誤)。
(2)printf函數的輸出格式控制
在“格式說明”中,對于不同類型的數據,要使用不同的格式字符。常見的格式字符如表3.1所示。
表3.1 printf函數的格式字符

在格式說明中,在引導符“%”和格式字符之間還可以插入附加格式說明字符,以便更精確地控制輸出格式。常見的附加格式說明字符見表3.2。
表3.2 printf函數的附加格式說明字符

格式控制部分中的格式字符的個數應該與輸出表列中要輸出的數據個數相等,而且位置也要一一對應。
下面簡單介紹各個格式字符的用法。
① d、o、x、u格式符
d、o、x、u格式符都是用來輸出整型數據的,其中d控制輸出帶符號的十進制整數,o輸出無符號的八進制整數,x輸出無符號的十六進制整數,而u輸出無符號的十進制整數。
下面舉例說明這4個格式符的用法。
%d、%o、%x、%u:按整型數據的實際長度輸出,例如:
unsigned int u=4294967295; printf("%d\n%u\n%o\n%x\n",u,u,u,u); /* 每個數占一行 */
其執行結果為:
-1 4294967295 37777777777 ffffffff
%md、%mo、%mx、%mu(m是一個正整數):m為指定的輸出寬度。如果實際數據的位數小于m,則左邊補足空格;如果大于m,則按實際位數輸出,m將不起作用。例如,
unsigned int u=4294967295; printf("%10d\n%10u\n%10o\n%10x\n",u,u,u,u);
其執行結果為(“_”代表空格):
-1 4294967295 37777777777(實際有11位數字) ffffffff
%-md、%-mo、%-mx、%-mu(m是一個正整數):與%md、%mo、%mx、%mu基本相同,只是輸出的數據向左端對齊,右端補空格,例如:
unsigned int u=4294967295; printf("%-10d<\n%-10u<\n%-10o<\n%-10x<\n",u,u,u,u); /* 用<表示邊界 */
其執行結果為:
-1 < 4294967295< 37777777777< ffffffff <
%ld、%lo、%lx、%lu:輸出長整型數據。
%hd、%ho、%hx、%hu:輸出短整型數據。例如:
unsigned short u=65535; printf("%hd,%hu,%o,%hx\n",u,u,u,u);
其執行結果為:
-1,65535,177777,ffff
通常,有符號整數可以用“%d”、“%hd”等格式符輸出,無符號整數可用“%u”、“%o”、“%x”等格式符輸出;輸出長(短)整型數據時應使用帶附加格式說明字符“l”(“h”)的格式說明,如“%ld”。
如果將有符號整數用無符號格式符控制輸出,或者反過來,將無符號整數用有符號的格式符控制輸出,就需要考慮數據的轉化規律了。實際上,不論有符號整數還是無符號整數,在計算機內存中都是用補碼表示的。假設在計算機內存中一個整數占4個字節(32位長度),“11111111111111111111111111111111”是內存中的一個二進制數。如果把這個數看做是無符號的整數,它就是十進制數4294967295(即232-1);如果看做是有符號整數,它就是十進制數-1。
② f、e、g格式符
f、e、g格式符都是用來輸出實型數據的。其中,f以小數形式輸出,e以指數形式輸出,g則根據輸出數據的長度自動選擇用小數或指數格式輸出。
現舉例說明它們的用法。
%f:按帶小數點的小數形式輸出,整數部分全部輸出,并輸出6位小數。
例如:
float f=456.123; printf("%f\n",f);
輸出結果為:
456.122986
注意,由于內存中的實數存在誤差,只有5~6位有效數字,所以達不到6位小數精度。
%e:按標準化指數形式輸出(小數部分的小數點前必有且只有1位非0數字),輸出寬度共占13列,其中,小數點占1位,小數點前的非0數字占1位,小數點后的小數部分由系統自動指定為6位,指數部分占5位(字母“e”占1位,指數符號占1位,指數占3位)。
例如:
float f=456.123; printf("%e\n",f);
輸出結果為:
4.561230e+002
%g:根據輸出數據的長度(位數)自動選擇按小數或指數格式輸出。
例如:
float f1=123.456789, f2=123456789; printf("%f,%e,%g\n",f1,f1,f1); printf("%f,%e,%g\n",f2,f2,f2);
輸出結果為:
123.456787,1.234568e+002,123.457 123456792.000000,1.234568e+008,1.23457e+008
%m.nf(m、n為正整數):指定輸出的數據共占m列,其中有n位小數。如果數值長度小于m,則左端補空格;如果超過m,則忽略m的限制。
例如:
float f=123.456789; printf("%10.3f,%5.3f\n",f,f);
輸出結果為:
_ _ _123.457,123.457(“_”代表空格,下同。)
如果省略了小數位數“.n”(同時省略小數點“.”),則輸出6 位小數(即n的默認值為6)。
例如:
float f=123.456789; printf("%10f,%5f\n",f,f);
輸出結果為:
123.456787,123.456787
如果只是省略了n,而保留了小數點“.”,如“%5.f”,則不輸出小數部分,相當于n為0。
%-m.nf:與%m.nf基本相同,只是輸出的數據向左對齊,在右端補空格。
%m.ne:指定輸出的數據共占m列,其中數據的小數部分(又稱尾數)有n位小數。如果數值長度小于m,則左端補空格。
③ c格式符
c格式符用來輸出一個字符,有兩種主要用法:%c和%mc。其中,m指定輸出寬度(通常m>1),輸出的字符輸出在指定的最后一列,即第m列,前面補m-1個空格。
例如:
char c='c'; printf("%c%3c\n",c,c);
輸出結果為:
c_ _c
在字符型數據的取值范圍內,整型數據可以與字符型數據通用。因此,一個整數,只要它的值在字符型數據范圍內,就可以用字符形式輸出。反之,一個字符型數據也可以用整型形式輸出。例如:
char c='A'; int i=65; printf("%c,%d\n",c,c); printf("%c,%d\n",i,i);
輸出結果為:
A,65 A,65
④ s格式符
s格式符用來輸出一個字符串,主要有以下幾種用法。
%s:直接輸出全部字符。例如:
printf("%s","china");
輸出結果為:
china
%ms(m是一個正整數):輸出的字符串占m列。如果字符串本身的長度大于m,則忽略m的限制,將字符串全部輸出;如果小于m,則左邊補空格。
%m.ns(m、n是正整數):從字符串中截取左邊的n個字符(不足則忽略n的限制),輸出到m列上。若不足m列,在左邊補空格。
%-m.ns(m、n是正整數):基本同%m.ns,只是輸出的字符串是左對齊的。
例如:
printf("%3s\n%7.2s\n%.4s\n%-5.3s\n","china","china","china","china");
輸出結果為:
china _ _ _ _ _ch chin chi_ _
需要注意,第1行突破了3的限制,第2行前面有5個空格,第3行占4列,最后一行占5列,右邊有2個空格。
(3)使用printf函數應注意的問題
① 格式字符要區分大小寫。
② 不同的運行環境在實現格式輸出時,輸出結果可能會有一些小的差別。例如,用%e格式符輸出實數時,有些系統輸出的指數部分為4位(如e+02)而不是5位(如e+002);前面的數字部分是5位小數而不是6位,等等。
③ 可以在“格式控制”字符串中使用“轉義字符”,如“\t”、“\n”、“\b”、“\r”、“\f”、“\345”、“\x1A”等,它們將被看做“普通字符”。
④ 如果想輸出字符“%”,則應該在“格式控制”字符串中用連續的兩個%表示,例如:
printf("%f%%",1.0/3);
輸出結果為:
0.333333%
(4)printf函數應用舉例
【例3.2】 用printf函數輸出數據。
程序如下:
1 #include <stdio.h> 2 #define PI 3.141592654 3 void main() 4 { 5 printf("不同精度的圓周率\n"); 6 printf("%4s\t%-8s\n","精度","圓周率"); /* 一個漢字占2位 */ 7 printf("%4d\t%-8.0f\n",1,PI); 8 printf("%4d\t%-8.1f\n",2,PI); 9 printf("%4d\t%-8.2f\n",3,PI); 10 printf("%4d\t%-8.3f\n",4,PI); 11 printf("%4d\t%-8.4f\n",5,PI); 12 printf("%4d\t%-8.5f\n",6,PI); 13 printf("%4d\t%-8.6f\n",7,PI); 14 printf("%4d\t%-8.7f\n",8,PI); 15 }
程序的運行結果如下:
不同精度的圓周率 精度 圓周率 1 3 2 3.1 3 3.14 4 3.142 5 3.1416 6 3.14159 7 3.141593 8 3.1415927