4.4 研究和利用printf()和scanf()

printf()和scanf()函数使您能够与程序通信。它们被称为输入/输出函数,或者被简称为I/O函数。它们不是只有您可以使用的CI/O函数,而且是最通用的I/O函数。在历史上,这些函数就像C函数库中的所有其他函数一样,不是C的定义的一部分。最初的时候C把输入/输出的实现留给了编译器的编写者,这样可以更好地使I/O与特定的机器相匹配。为了兼容性起见,不同的实现中都带有各自的scanf()和printf(),但它们之间偶尔有一些差异。C90和C99标准描述了这些函数的标准版本,我们将遵循这个标准。

虽然printf()是输出函数,scanf()是输入函数,但是它们的工作几乎相同,都使用了控制字符串和参数列表。我们将依次给出printf()和scanf()函数的工作原理。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

4.4.1 printf()函数

请求printf()打印变量的指令取决于变量的类型。例如,在打印整数时使用%d符号,而在打印字符时使用%c符号。这些符号被称为转换说明(conversion specification),因为它们指定了如何把数据转换成可显示的形式。我们将会列出ANSIC标准为printf()提供的各种转换说明,然后将示范如何使用一些较为常用的转换说明。表4.3给出了转换说明符和用这些转换说明符打印的输出类型。

表4.3 转换说明符及作为结果的打印输出

 

 

转换说明 输出
%a 浮点数、十六进制数字和p-记数法(C99)
%A 浮点数、十六进制数字和P-记数法(C99)
%c 一个字符
%d 有符号十进制整数
%e 浮点数、e-记数法
%E 浮点数、E-记数法
%f 浮点数、十进制记数法
%g 根据数值不同自动选择%f或%e。%e格式在指数小于-4或者大于等于精度时使用
%G 根据数值不同自动选择%f或%E。%E格式在指数小于-4或者大于等于精度时使用
%i 有符号十进制整数(与%d相同)
%o 无符号八进制整数
%p 指针
%s 字符串
%u 无符号十进制整数
%x 使用十六进制数字0f的无符号十六进制整数
%X 使用十六进制数字0F的无符号十六进制整数
%% 打印一个百分号
4.4.2 使用printf()

程序清单4.6中包含的程序使用了一些转换说明。

程序清单4.6 printout.c程序

阅读 ‧ 电子书库

阅读 ‧ 电子书库

显然,输出就是:

The 5 CEOs drank 13.500000 cups of expresso.

The value of pi is 3.141593.

Farewell! thou art too dear for my possessing,

$6200

以下是printf()的使用格式:

printf (Control-string, iteml, item2, …);

iteml, item2等等都是要打印的项目。它们可以是变量,也可以是常量,甚至可以是在打印之前进行计算的表达式。控制字符串(control-string)是一个描述项目如何打印的字符串。正如第3章“数据和C”中所提及的,控制字符串应该为每个要打印的项目包含一个转换说明符。例如,考虑如下语句:

printf (“The %d CEOs drank %f cups of expresso.\n”, number, expresso);

控制字符串就是双引号内的语句。它包含了分别对应于number和expresso(要显示的两个项目)的两个转换说明符。图4.6给出了printf()语句的另一个示例。

下面是示例程序中的另外一行:

printf (“The value of pi is %f.\n”, PI);

这一次,项目列表中只有一个成员,即符号常量PI。

正如图4.7所示,控制字符串包含了两种形式截然不同的信息:

● 实际要打印的字符。
● 转换说明。

阅读 ‧ 电子书库

图4.6 printf()的参数

阅读 ‧ 电子书库

图4.7 一个控制字符串的结构