發信人: 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) 就會被列印出來。