
3.2 数据输出
C语言不提供输入/输出语句,数据的输入/输出是通过函数调用语句来实现的。在C语言标准函数库中提供了一些输入/输出函数,它是以标准的输入/输出设备(键盘、显示器等)为输入/输出对象的。输入函数有scanf函数和getchar函数,scanf称为格式输入函数。常用的输出函数有printf和putchar,printf称为格式输出函数。
这些函数的原型(函数名、返回值类型、形式参数)在文件stdio.h中定义,因此,使用输入/输出函数时,必须在源程序的开头使用如下语句:

或:

3.2.1 格式输出函数printf
它一次可以输出多个数据,并且可以是各种类型,还可以根据需要按指定的格式输出。printf函数的形式为:

执行printf函数时,按照格式字符串所指定的格式,把参数进行映射,显示在终端屏幕上。例如:

双引号内的x=%f,y=%d\n即是格式控制符,x,y是要输出的数据。格式控制符是一个用双引号括起来的字符串,它可以包括以下三部分。
1.格式字符串
格式字符串由“%”和后跟的格式字符组成,必须用英文半角的双引号括起来。
C语言提供的格式字符串如表3-1所示。
表3-1 C语言的格式字符串一览表

格式字符串中的“%”是必不可少的,它也是格式说明的标志。
格式说明中,在“%”和上面这些格式字符之间还可以插入几种附加格式说明符,如表3-2所示。
表3-2 C语言的附加格式说明符

2.普通字符
格式控制符之内还可以有一些普通字符,这些普通字符按原样输出。上例中的“x=”和“y=”就是普通字符,当x=21.345678,y=32时,上例的输出结果为:x=21.345678,y=32。
普通字符的作用主要是对后面输出的数据作些说明或解释,以便看起来容易理解些,这些普通字符可以有,也可以没有。例如上例也可写成:

它的输出结果为:21.345678,32
注意,这里的逗号,即隔开%f和%d之间的逗号也属于普通字符,它也会照原样输出。
最普通的printf函数一般输出形式为:

它的输出结果为:21.345678 32
这样的输出结果有时候感到不容易理解,所以最好能用普通字符对输出结果作些解释。
3.输出变量
输出变量也称为输出参数,是输出函数的最后一部分,也是最关键的一部分。它是实际要输出的对象。格式输出函数实际就是把这些变量的内容按照指定格式进行输出,可以说格式控制符是为这些变量服务的。
一般而言,输出数据可以是变量,也可以是表达式,还可以是函数。对于变量,会输出变量的值。对于表达式或者函数,则在输出前要先求出表达式或函数的值,然后将其值进行输出。也就是说“先计算,后输出”。例如:

输出变量还可以是字符串常量,也可以是字符数组。
注意
在输出格式控制符的后面,一定要用逗号“,”把格式字符串和输出变量之间隔开。这样,格式输出函数就分为两大部分:格式字符串和输出变量,它们之间用逗号隔开。
输出变量可以是多个变量,各个变量之间也用逗号“,”隔开。每一个输出变量应该有对应的一个格式字符串,它们之间是一一对应的关系。不能多个输出变量对应一个格式控制符,例如:

这样的语句只会输出变量x的值,y和z的值则得不到输出。
也可用printf直接输出字符串常量。例如:

输出结果为:Happy New Year!
这里直接用双引号把要输出的字符串括起来,不要“%”开头的格式控制符,后面也要不其他输出参数。输出时可以用一句话概括“引号脱去,原样显示”。
用这种方法只能输出字符串常量,如果输出存放在字符数组里的字符串则仍需要用格式控制符“%s”。
下面关于具体的格式字符我们再作说明。
1.d格式符
它用于十进制整数的输出,有几种不同的用法。
(1)%d按整数的实际长度输出。
(2)%md,m是一个正整数,它指定了输出字段的宽度,如实际数据的位数小于m,则左端填补空格。如大于m,则按实际的位数输出。例如,设x=978,y=8765324时:

输出结果为x=978,y=8765324
(3)%ld,用于输出长型long整数,对已被定义为长型的变量,必须用“%ld”输出,否则会出错。
2.o格式字符
主要用于输出八进制整数,由于它把符号位当作八进制数的一部分,所以不能输出负数,否则会出错。
3.x格式字符
用于输出十六进制整数,由于它把符号位当作十六进制数的一部分,所以也不能输出负数,否则会出错。
4.u格式字符
用于输出十进制无符号整数。
5.c格式字符
用于输出一个字符。
6.s格式字符
用于输出一个字符串,有下面几种不同形式。
(1)%s。
例如:

输出结果为:

printf函数中的输出变量可以是字符串常量,也可以是字符数组。
(2)%ms。
指定输出的字符串占m列,m是一个正整数。如果字符串的长度大于m,则不会被截断,仍按原有的长度全部输出;如果字符串的长度小于m,则在左边填补空格。
(3)%m.ns。
指定输出的字符串占m列,取字符串中左边的n个字符,输出时向右对齐。m和n为正整数。如果字符串的长度大于m,则不会被截断,仍按原有的长度全部输出;如果字符串的长度小于m,则在左边填补空格。
(4)%-ms。
从左边开始输出,即靠左对齐,指定输出的字符串占m列。m为正整数。如果字符串的长度大于m,则不会被截断,仍按原有的长度全部输出;如果字符串的长度小于m,则在右边填补空格。
7.f格式字符
用于输出一个实数,有下面几种不同形式。
(1)%f。
输出6位小数,整数位有多少位就输出多少位。由于float型的有效数字只有7位,因此可能会输出一些无效的数据。例如:

输出结果为:

x的整数部分共有9位,但只有前面7位是正确的,后面的2位以及所有的小数部分都不对,y的小数部分也有不正确的数字。
假如我们把上面的程序修改为:

则输出结果会为:

由于double型数据的有效数字为15~16位,所以上面的数据输出结果才会正确。所以对于实型数据一定要考虑它的有效数字是多少位。
(2)%m.nf。
输出m位数据,其中n位为小数,一般要求m>n,如果数据长度位小于m,则左边填补空格。
(3)-m.nf。
从左边开始输出,共输出m位数据,其中n位为小数,一般要求m>n,如果数据长度位小于m,则右边填补空格。
8.e格式字符
以指数的形式输出一个实数,小数点前必须有一位整数,可以是0,而且也只能有1位整数。%e格式符输出的实数共占13位,其中e占1位,指数占3位,指数符号占1位,小数占6位。
%e格式符也可以用%m.ne和%-m.ne来输出。这时,m指定输出的数据共m位,n为小数的位数。当实际的长度大于m时,按实际的长度输出,也可以不指定总长度而只指定小数位的长度,如%.4e,这时小数输出4位,应注意,这里的小数点“.”不能省略。当m大于实际长度时,左边补0。如有负号“-”,即%-m.ne,则输出数据向左对齐,当m大于实际长度时,右边补0。
9.g格式字符
用来将一个实数以最少的位数输出,它将选择f格式符或e格式符中所需位数最少的一种形式输出一个实数。
3.2.2 字符输出函数putchar
函数:putchar
作用:用来向屏幕输出一个字符。注意,只能输出一个单字符。
例如:

putchar('A')把字符'A'输出到屏幕,putchar(ch)把字符变量ch的值输出到屏幕,输出结果为单字符'&'。