Linux 版 (精华区)

发信人: netiscpu (夜☆星光点点☆), 信区: Linux
标  题: ◇ 星星流讲座 0011
发信站: 紫 丁 香 (Sun Nov  8 18:26:05 1998), 转信


寄信人: guest.bbs@hgluo.hust.edu.cn 
标  题: ◇ 星星流讲座 0011
发信站: 华南理工大学 BBS木棉站
日  期: Thu Feb 20 14:41:15 1997

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


;35m第 3 讲 之 4            基本的输入与输出
                        Topic: Usage of printf (1)m

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) 就会被列印出来。

--
本文原作者为徐振家,原作刊载於星星神教总坛 ☆清华电机☆ test 板。
你可以以电子文件的形式将本文自由流传於台湾学术网路,但必须包含此版权声明。
原作者依中华民国著作权法之规定,享有本文之著作权,请勿抄袭以免触法。
未经授权任何人不得以任何形式对本文做任何修改及商业上之应用。
其他网路的转载或其他用途的应用,请先知会作者,并取得其同意。
对本文有任何疑问或意见请 mail 给 ax.bbs@bbs.ee.nthu.edu.tw,谢谢。


--
m;32m※ 转寄:.华南网木棉站 bbs.gznet.edu.cn.[FROM: mtlab.hit.edu.cn]
--

                              Enjoy Linux!
                          -----It's FREE!-----

※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: mtlab.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.405毫秒