1.3 分析C语言程序的结构
大型的C语言程序就像一辆汽车,由各个零件组成,零件完美组合才能使汽车跑起来,这需要汽车组装工非常了解汽车各个零件的功能。在编写C语言程序时,程序员就相当于汽车组装工,需要知道C语言程序的结构,每行代码的作用。
1.3.1 头文件
万事从“头”开始,就像汽车的头部,包括车灯、车牌及车品牌名等,如图1.23所示。
图1.23 汽车的头部
C语言程序也有头文件,头文件就像人的大脑,里面记录了许多天生就存在、不需要记忆的函数库。函数库就是函数的仓库,只要引用某个函数库,该函数库中的函数就可以随便使用。例如,引入stdio.h函数库,代码如下:
1.#include
#include是使用头文件的命令,是头文件的重要组成部分。“#”表示预处理命令;“include”是包括、计入的意思,也就是包括后面的函数库。“include”后面的函数库名称用英文半角格式的尖括号“〈〉”或英文半角格式的双引号“""”括起来。例如:
这两种头文件表示方法都是正确的,二者之间的区别如下:
●如果使用尖括号,那么系统会到存储C语言函数库的目录中寻找要包含的头文件。这是标准方式;
●如果使用双引号,那么系统会先在用户当前目录中寻找要包含的头文件,如果找不到,那么再到存储C语言函数库的目录中寻找要包含的头文件。
2.stdio.h
stdio.h是内存空间中的函数库之一,是C语言中的输入/输出函数库,包含各种各样的输入/输出函数(如printf()、gets()、putchar()函数等),所以在进行输入或输出操作时都需要使用这个函数库。
学习笔记
C语言中除了stdio.h函数库,还有很多函数库,具体函数库及其包含的函数可以参考相关函数手册。
1.3.2 主函数
构成C语言程序的基本单位是函数。在众多函数中,需要从一个函数打入程序内部,这个函数就是主函数,即main()函数。main()函数相当于汽车的车门,要驾驶汽车,首先需要从车门进入驾驶舱,也就是说,main()函数是可执行程序的入口函数,程序都是从main()函数开始执行的。main()函数的语法格式如下:
main()函数前面的int表示主函数的返回类型,也就是需要返回一个整型数据,而程序的最后是return 0,说明0是函数的返回值。return 0是返回系统操作,表示程序正常退出。return语句通常写在程序的最后,表示这个程序结束了。
主函数可以不带参数,也可以带参数,如果使用带参数形式,那么需要有两个参数,第一个参数是int型,表示命令行中的字符串数,按照习惯(不是必须),将参数名称定义成argc(Argument Count);第二个参数是字符串型,表示一个指向字符串的指针数组,按照习惯(不是必须),将参数名称定义为argv(Argument Value)。
1.3.3 输出函数
输出是从内部到外部的传递过程。输出设备的种类有很多,如图1.24所示,这些输出设备输出的东西我们能看得见。
图1.24 输出设备
C语言程序也是一样,代码在计算机内部进行编译,但是编译过程我们看不到,只有将编译结果输出到外部,我们才能看到。C语言程序需要一个媒介输出,即输出函数——putchar()函数、puts()函数及printf()函数。
1.putchar()函数
putchar()函数每次只能输出单个字符,该函数是stdio.h函数库中的函数,它的语法格式如下:
其中的参数ch是要输出的字符,可以是字符型或整型变量,也可以是常量。例如:
学习笔记
从这3行代码中可以看出,单个字符使用的是英文半角格式的单引号“''”。
putchar()函数的另一种形式是定义字符型变量并赋值,然后输出该字符。例如,利用putchar()函数输出字符拼成“小猪”的表情,具体代码如下(实例内容参考配套资源中的源码):
运行上述程序,运行结果如图1.25所示。
图1.25 输出“小猪”表情
学习笔记
char是数据类型之一,表示字符型,具体知识将在第二章讲解;变量赋值是利用“=”赋值,表示将等号右侧的值赋给等号左侧的变量。
2.puts()函数
puts()函数一次可以输出多个字符,主要用于输出一个字符串,它也是stdio.h函数库中的函数,它的语法格式如下:
其中,字符指针变量str是形式参数,主要用于接收要输出的字符串。例如,使用puts()函数输出一个字符串常量,代码如下:
这行代码可以输出一个字符串,之后会自动进行换行操作。这与printf()函数(下面讲解具体用法)有所不同,在printf()函数中进行换行时,要在字符串中添加转义字符“\n”。puts()函数会在字符串中判断“\0”结束符,在遇到“\0”结束符后,后面的字符不再输出,并且自动换行。例如:
在加上“\0”结束符后,puts()函数输出的字符串就变成了“Welcome”。
学习笔记
●字符串使用的是英文半角格式的双引号“""”。
●编译器会在字符串常量的末尾添加结束符“\0”,因此puts()函数会在输出字符串常量后自动进行换行操作。
3.printf()函数
printf()函数是控制格式输出函数,它也是stdio.h函数库中的函数,它的语法格式如下:
1)格式控制。
格式控制是用双引号括起来的字符串,又称为转换控制字符串,包括格式字符和普通字符共两种字符。
●格式字符主要用于进行格式说明,作用是将数据转换为指定的格式输出。格式字符是以“%”字符开头的。
●普通字符是需要原样输出的字符,包括双引号内的逗号、空格和换行符。
2)输出列表。
输出列表中列出的是要输出的数据,可以是变量,也可以是表达式。
例如:
运行以上代码,输出结果为“521 I Love You”。在格式控制的双引号中的字符是“%d I Love You”,其中的“I Love You”字符串中的字符是普通字符,而“%d”是格式字符,表示输出后面的iInt表示的数据。
printf()函数常用的格式字符如表1.1所示。
表1.1 printf()函数常用的格式字符
1.3.4 输入函数
输入是从外部到内部的传递过程。C语言程序使用输入函数实现输入功能。C语言中的输入函数有getchar()函数、gets()函数及scanf()函数。
1.getchar()函数
getchar()函数每次只能从终端(输入设备)输入一个字符,该函数是stdio.h函数库中的函数,它的语法格式如下:
getchar()函数没有参数,该函数的值就是从输入设备得到的字符。例如,从输入设备得到一个字符,将其赋给字符变量cChar,代码如下:
学习笔记
getchar()函数每次只能接收一个字符。getchar()函数得到的字符可以赋给一个字符变量或整型变量,也可以不赋给任何变量,还可以作为表达式的一部分。例如,“putchar(getchar());”表示将getchar()函数作为putchar()函数的参数,getchar()函数从输入设备得到字符,然后putchar()函数将字符输出。
例如,使用getchar()函数输入一个小写字母,输出对应的大写字母,具体代码如下(实例内容参考配套资源中的源码):
运行上述程序,运行结果如图1.26所示。
图1.26 将输入的小写字母转换为大写字母
学习笔记
小写字母的ASCII码值比大写字母的ASCII码值大32。例如,小写字母a的ASCII码值是95,将数值95减去32得到数值65,ASCII码值65对应的是大写字母A。
2.gets()函数
gets()函数主要用于获取用户从终端(输入设备)输入的一个字符串,它也是stdio.h函数库中的函数,它的语法格式如下:
其中,字符指针变量str是形式参数,主要用于存储读取的字符串。在读取字符串的过程中,当出现新的一行时停止读取。新的一行的换行字符会转换为字符串中的结束符“\0”。
例如,前面已经定义了字符数组变量cString,使用gets()函数获取输入字符数组的方式如下:
3.scanf()函数
scanf()函数主要用于按照指定的格式接收用户从终端(输入设备)输入的数据,并且将输入的数据存储于指定的变量中,它也是stdio.h函数库中的函数,它的语法格式如下:
scanf()函数的格式控制与printf()函数的格式控制相同。地址列表中的地址是接收数据变量的地址。例如,得到一个整型数据,具体代码如下:
在这一行代码中,“&”符号表示取iInt变量的地址。在变量前加“&”符号,表示取该变量的地址。
学习笔记
scanf()函数在读取数据时不检查边界,因此Microsoft公司的Visual Studio开发工具提供了scanf_s()函数,它的功能与scanf()函数相同,Visual Studio开发工具认为scanf_s()函数更安全。