深入剖析printf函数(下):---形参列表和格式化输出是如何做到的?
By Long Luo
一、引言
在上一篇 深入剖析printf函数(上):如何不借助第三方库在屏幕上输出”Hello World”? 里,我们已经实现了用汇编语言在屏幕上输出了“Hello World”
, 迈出了万里长征的第一步,但是我们知道实际的printf
的功能是十分强大的,它和scanf
一样属于标准输入输出的一种格式化函数,我们一般是这样使用它的:1
printf()的基本形式:printf("格式控制字符串",变量列表);
二、格式化输出
printf()
函数是格式输出函数,请求printf()
打印变量的指令取决与变量的类型.
例如,在打印整数是使用%d
符号,在打印字符是用%c
符号.这些符号被称为转换说明.因为它们指定了如何不数据转换成可显示的形式.
下列列出的是ANSI C标准printf()
提供的各种转换说明:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18转换说明及作为结果的打印输出
%a 浮点数、十六进制数字和p-记数法(C99)
%A 浮点数、十六进制数字和p-记法(C99)
%c 一个字符
%d 有符号十进制整数
%e 浮点数、e-记数法
%E 浮点数、E-记数法
%f 浮点数、十进制记数法
%g 根据数值不同自动选择%f或%e.
%G 根据数值不同自动选择%f或%e.
%i 有符号十进制数(与%d相同)
%o 无符号八进制整数
%p 指针
%s 字符串
%u 无符号十进制整数
%x 使用十六进制数字0f的无符号十六进制整数
%X 使用十六进制数字0f的无符号十六进制整数
%% 打印一个百分号
三、形参列表的读入
printf
函数的参数列表是如下的形式:1
int printf(const char *fmt, ...)
类似于上面参数列表中的token:…,这个是可变形参的一种写法。当传递参数的个数不确定时,就可以用这种方式来表示。
但是电脑比程序员更笨,函数体必须知道具体调用时参数的个数才能保证顺利执行,那么我们必须寻找一种方法来了解参数的个数。
让我们先回到代码中来: