BBS水木清华站∶精华区

发信人: ax.bbs@bbs.ee.nthu.edu.tw. (athena), 信区: test 
标  题: 星星流讲座 0011 
发信站: ☆清华电机☆ (Wed May 10 19:47:43 1995) 
 
 
第 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 

0xc 
 
这儿比较不易理解的是 # 这个 flag 的作用。例如像十六进位数,我们在 C 语 
言中会在它的前面加上 0x,但是如果使用 printf ("%x", 0xc); 这样儿印出来 
的话前面的 0x 这个前置词 (prefix) 就会被去掉了,如果要保留的话就得加上 
# 这个 flag。又如浮点数若恰巧为整数值,则小数点和其後面的 0 未必会被印 
出来 (视厂商如何制作编译器),此时若加上 # 这个 flag 则小数点和其後面的 
0 (也就是所谓的 postfix) 就会被列印出来。 
 
-- 
本文原作者为徐振家,原作刊载於星星神教总坛 ☆清华电机☆ test 板。 
你可以以电子文件的形式将本文自由流传於台湾学术网路,但必须包含此版权声明。 
原作者依中华民国著作权法之规定,享有本文之著作权,请勿抄袭以免触法。 
未经授权任何人不得以任何形式对本文做任何修改及商业上之应用。 
其他网路的转载或其他用途的应用,请先知会作者,并取得其同意。 
对本文有任何疑问或意见请 mail 给 ax.bbs@bbs.ee.nthu.edu.tw,谢谢。 
 
 

BBS水木清华站∶精华区