
3.2.1 数据的输出
1.putchar函数
用于向屏幕输出一个字符,只能输出字符,并且是一个字符,所以该函数的用处不是很大。
putchar函数的格式为:

有几点说明:
(1)圆括号中的c可以是字符型变量或者整型变量,代表要输出的内容。
(2)putchar函数属于标准I/O库中的函数,为了能够使用这些函数,需要用一个#include命令(后面章节会讲)将某些文件包含到用户的源文件中,其效果就相当于把某个文件中的内容原封不动地贴到#include命令所在的位置。在此,需要使用#include命令将stdio.h这个文件包含到当前的源码文件中,并且#include要写在源码文件的开头位置,内容如下:

上面这行代码中的stdio.h是一个什么文件呢?这是一个系统文件,因为这个文件是以.h作为扩展名,所以常称为头文件(headfile),在安装Visual Studio的时候,很多系统文件会被自动安装到计算机中。一般来说,#include命令主要用来包含一些.h头文件。
同时,因为每个人所使用的Visual Studio版本可能各不相同,所以新版本的Visual Studio也许并不需要使用上述的#include命令来包含stdio.h文件,如果在使用putchar函数编写代码时,代码能够成功编译并运行起来,不提示有什么错误,则没有必要使用#include命令,如果代码报错无法运行,就需要把#include<stdio.h>放在源代码文件的开头位置。
此外,看一看如下两行代码的区别,这是面试时经常考的一个问题:

用尖括号<>括起来的头文件被#include时,表示让Visual Studio去系统目录中寻找stdio.h文件,所以一些系统提供的标准头文件如stdio.h、stdlib.h等在#include时都应该使用尖括号<>括起来。而用双引号""包含起来的头文件被#include时,Visual Studio会首先在当前源代码文件所在的目录下寻找,如果找不到,再到系统目录中寻找,所以,通常开发者自己写的一些头文件,在被#include包含进来时,往往使用双引号""包含起来。在这里,使用#include<stdio.h>和#include "stdio.h"效果相同,因为当前目录下没有stdio.h文件,最终都会到系统目录下去寻找stdio.h头文件。
看看如下范例:

2.
printf函数
用于向屏幕输出若干个任意类型数据。
printf函数的格式为:

格式中的“格式控制字符串”是用双引号包含起来的字符串,包含两种可能的信息:
(1)原样输出的普通字符,如“printf("HelloWorld");”,原样输出“HelloWorld”。
(2)字符串中也可以包含格式字符,如已经用过的%d、%f、%c等。
看看下面这行代码:

上述printf函数中,圆括号中内容都属于printf函数的参数,因此,printf函数的格式也可以表示为:

可以看到,printf函数的参数个数并不固定,其实现的输出功能可以浓缩为一句话:将参数2,参数3,…,参数n按参数1给定的格式输出。
上面谈到,在printf函数的格式控制字符串中可以包含格式字符,不少格式字符都曾经用到过,在这里做一个整体回顾。
(1)%d:以十进制数形式输出一个数字。看如下代码:

(2)%o:以八进制数形式输出一个数字,输出的数字不能是负数,否则结果会在意料之外,该格式字符用途较小。看如下代码:

(3)%x:以十六进制数形式输出一个数字,输出的数字不能是负数,否则结果会在意料之外,该格式字符有一定的用处,某些场合可能需要以十六进制形式输出数字从而方便观察。看如下代码:

(4)%u:以十进制数形式输出一个unsigned(无符号)类型数据。虽然能够使用%d输出一个unsigned类型数据,但如果输出的数据类型确实是unsigned类型,强烈建议使用%u输出以防出现意外,因为无符号类型表示的数据范围比有符号类型大1倍。当然,一个有符号数也可以用%u输出,显然该有符号数是正数时没问题,但一旦该有符号数是负数,用%u输出就会导致结果错误,所以一定要使用最合适的格式字符来输出数据,才能保证不出现错误。看如下代码:

(5)%c:输出一个字符。看如下代码:

表2.4展示了字符对应的ASCII码表,基本的ASCII码表对应的是0~127之间的一个数字,实际上还有扩展的ASCII码表,基本ASCII码加扩展的ASCII码,整个ASCII码范围是0~255之间的数字,所以只要一个整数的范围在0~255之间,都可以用字符形式输出。例如,字符a的ASCII码是97,那么就可以通过97来显示对应的字符a。看如下代码:

当然一个字符也可以用整数形式输出,此时输出的就是该字符对应的ASCII码,前面曾经说过,其实字符在内存中就是用数字的形式保存的:

(6)%s:输出一个字符串。前面曾经说过,字符串末尾有一个系统自动加入的'\0'作为字符串结束标记,但显示的时候'\0'并不显示出来。看如下代码:

(7)%f:以小数的形式输出单精度实数、双精度实数。看如下代码:

格式字符还有很多,不常用的不在这里介绍,以免浪费不必要的时间。如果为了解决考试问题,建议利用搜索引擎进行搜索学习,在搜索引擎中输入“printf格式字符”,可以找到很详细的信息。例如,有些格式字符可以控制输出对齐,有些可以控制小数点后显示几位。前面演示过的.20f,就是控制小数点后输出20位。看如下代码:

最常用的格式字符就是上面介绍的这些,其中尤其以%d、%s最为常用。格式字符不必死记硬背,需要时查阅即可。
最后,再次强调值得注意的三个问题:
(1)用printf函数输出数据时,格式字符要与所输出的数据相匹配,否则输出的结果很可能出错。
(2)如果想在printf中输出一个“%”有三种方法。看如下代码:

(3)%后面跟随的格式化字符一般多为一个字符,其后面紧跟的其他字符并不是格式化字符的一部分。看如下代码:
