發信人: ax.bbs@bbs.ee.nthu.edu.tw. (athena), 信區: test
標 題: 星星流講座 0011
發信站: ☆清華電機☆ (Wed May 10 19:47:43 1995)
轉信站: star
星星流講座 0011 C 語言教室
第 3 講 之 4 基本的輸入與輸出
Topic: Usage of printf (1)
printf 是我們最常用的一個函數,它的功用是對資料做格式化,然後
把結果輸出到螢幕上。printf 這個函數的函數原型放在 stdio.h 這個
標頭檔裡,所以當我們要叫用 printf 這個函數之前,必須含入這個標
頭檔 #include <stdio.h>,這是因為函數在使用前必須經過宣告。
那麼,printf 的函數本體在那裡呢?其實 printf 是標準函式庫 (
standard library) 中的一個函數,標準函式庫就是 C 語言標準中規
定每一個 C 語言編譯器所必須提供的函數形成的集合,使用者只要含
入標準標頭檔 (standard header file),就可以叫用標準函式庫中的
函數,前面提到過的連結器 ld 會自動地到函式庫中去找尋 printf 的
函數本體。
printf 的格式很簡單,它的基本使用法如下例:
printf ("%d \n", i);
↗ ↖
格式 替換變數
(format string)
格式是一個字串,它指示 printf 應該如何地在螢幕上顯示,如上例中
"%d \n" 就是指示 printf 印出一個整數,在整數的後面印出五個
空白,然後換行。以 % 開頭的字 (word) 就是「變數列印格式」,它
基本上分為五個欄位:
欲列印變數的型態
↙
%[Flags][Width][.Precision][Size][Type]
↗ ↑ ↖ ↖
列印選擇項 欄寬 浮點數精確度 欲代換變數的大小
欄寬為欄位寬度,例如 %8d 就表示列印一整數,但是最多只列印八個字
在螢幕上 (意即該整數超過八位的地方會被捨去)。
Type 為欲列印變數的型態,列表如下:
Type 型態 輸出格式
------------------------------------------------------------
c char 單一字元
d int 有號的十進位數字
e float 或 double 以科學記號表示的有號數
如:-1234567e+002
E float 或 double 以科學記號表示的有號數
如:-1234567E+002
f float 或 double 列印浮點數,預設小數點後精度 6 位
g float 或 double 列印浮點數,預設小數點後精度 3 位
不列印不必要的 0 和小數點
指數次方小於 -4 或大於精確度欄位指
定值時以科學記號型式輸出
G float 或 double 同 g,但輸出科學記號時以 G 代 E
i int 有號的十進位數字
n int * printf 已列印的文字數目
o unsigned 無號八進位數
p void * 指標內含
s char * 字串
u unsigned int 無號十進位數
x unsigned 無號十六進位數,abcdef 小寫
X unsigned 無號十六進位數,ABCDEF 大寫
Flags 為列印選擇項,列表如下:
Flag 意義 預設值
------------------------------------------------------------
- 向左對齊 向右對齊
+ 不論正負數均列印正負號 只有負數才列印正負號
空白 正數前加上空白 正數前不加空白
0 數字前補 0 數字前不補 0
# 強迫列印 prefix 和 postfix 不強迫
請看下面的範例程式:
/* printf1.c */
#include <stdio.h>
void main (void)
{
printf ("%8d\n%-8d\n", 1234, 1234);
printf ("%+8d\n", 1234);
printf ("% d\n", 1234);
printf ("%08d\n", 1234);
printf ("%x\n%#x\n", 0xc, 0xc);
}
執行結果:
1234
1234
+1234
1234
00001234
c
0xc
這兒比較不易理解的是 # 這個 flag 的作用。例如像十六進位數,我們在 C 語
言中會在它的前面加上 0x,但是如果使用 printf ("%x", 0xc); 這樣兒印出來
的話前面的 0x 這個前置詞 (prefix) 就會被去掉了,如果要保留的話就得加上
# 這個 flag。又如浮點數若恰巧為整數值,則小數點和其後面的 0 未必會被印
出來 (視廠商如何製作編譯器),此時若加上 # 這個 flag 則小數點和其後面的
0 (也就是所謂的 postfix) 就會被列印出來。