發信人: ax.bbs@bbs.ee.nthu.edu.tw. (athena), 信區: test
標  題: 星星流講座 0015
發信站: ☆清華電機☆ (Sun May 14 12:35:45 1995)
轉信站: star

星星流講座 0015         C 語言講座

第 3 講 之 8            基本的輸入與輸出
                        Topic: Usage of scanf (2)

scanf 的 Type 欄位其意義列表如下:

        型態            意義
        --------------------------------------------------
        c               單一字元,在此格式下所有的空白字元
                        都不會被忽略,這是比較特殊的。
        d               十進位有號整數。
        e f g           有號浮點數,浮點數可以用科學記號的
                        方式由鍵盤輸入,scanf 會自動把 e或
                        E 之後的數字當成次方數。
        i               有號整數,可以是十進位、八進位 (以
                        0 開頭) 或十六進位 (以 0x 開頭)。
        n               此非真正的讀取格式,對應此格式的參
                        數必須為整數,它的內容是由鍵盤輸入
                        的字元數目。
        o               無號八進位數 (不管有無 0 開頭均視
                        輸入為八進位數)。
        p               位址。
        s               字串。
        u               無號十進位數。
        x               無號十六進位數 (不管有無 0x 開頭均
                        視輸入為十六進位數)。
        %               無特別意義,只是要求輸入 % 這個字
                        元。
 

scanf 的 Size 欄位是用來配合 Type 欄位使用的,它的意義列表
如下:

        前置詞          使用時機
        --------------------------------------------------
        h               當以 d、i、o、x、u 讀取整數值時,
                        用以代表參數為短整數。
        l               當以 d、i、o、x、u 讀取整數值時,
                        用以代表參數為長整數。以 e、f、g
                        讀取浮點數時則代表讀取的數值型態
                        為 mdouble0m。long double
                        型態必須用大寫的前置詞 L 來指定。
 

Type 欄位另有兩種比較罕用的用法,列表如下:
 

        型態            意義
        --------------------------------------------------
        [...]           型態正比對 (pattern matching),它是
                        用來比對輸入字串用的。
        [^...]          型態反比對,見例子。
 

什麼叫做比對輸入字串呢?請看範例程式:

/* match.c */
#include <stdio.h>

void main (void)
{
     char s[10];

     printf ("Input string: ");
     scanf ("%[12345]", s);
     printf ("%s\n", s);
}
 

執行結果:

Input string: 123ab4
123

比對的意思就是找尋符合括號中字元集的最長字串,例如 123ab4 中
含有數字 1-5 的最長字串是 123。%[12345] 這個格式字串可以簡寫
成 %[1-5],請讀者自己試試看。

那麼,什麼叫做反比對呢?以上面的例子而言,如果我們把 %[1-5]
改成 %[^1-5],那麼輸入 123ab4 會得到 ab 這個輸出,反比對的意
思就是不符合括號中字元集的最長字串。

對於 scanf 我們並不打算寫一個完整的範例程式,沒錯,懶惰的作
者又要給各位實作的機會了,請你自己動手寫寫看你能不能用 scanf
讀進所有型態的資料,再利用你上次寫過的 printf 的程式裡的方法
把它們一一印出來。