![零基础C语言学习笔记](https://wfqqreader-1252317822.image.myqcloud.com/cover/191/36710191/b_36710191.jpg)
1.3 分析C语言程序的结构
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt002_27.jpg?sign=1738819122-pDB2jtXV2Y4PrWFTuQPq90DHW6LwiyKD-0-ae95174bb642061c1889e0768085c5cc)
大型的C语言程序就像一辆汽车,由各个零件组成,零件完美组合才能使汽车跑起来,这需要汽车组装工非常了解汽车各个零件的功能。在编写C语言程序时,程序员就相当于汽车组装工,需要知道C语言程序的结构,每行代码的作用。
1.3.1 头文件
万事从“头”开始,就像汽车的头部,包括车灯、车牌及车品牌名等,如图1.23所示。
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt002_28.jpg?sign=1738819122-XELZXSORaTkqcbRQI8PrCJulufURyKhj-0-1f7ebf2eecc87aaa119e0b676cb6fc9d)
图1.23 汽车的头部
C语言程序也有头文件,头文件就像人的大脑,里面记录了许多天生就存在、不需要记忆的函数库。函数库就是函数的仓库,只要引用某个函数库,该函数库中的函数就可以随便使用。例如,引入stdio.h函数库,代码如下:
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt002_29.jpg?sign=1738819122-C3ReHNu6r5px7wJkVQ1et7P1BqeJpWTD-0-b04607feba13700c6a62a34bc70b571e)
1.#include
#include是使用头文件的命令,是头文件的重要组成部分。“#”表示预处理命令;“include”是包括、计入的意思,也就是包括后面的函数库。“include”后面的函数库名称用英文半角格式的尖括号“〈〉”或英文半角格式的双引号“""”括起来。例如:
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt002_30.jpg?sign=1738819122-cfe0QBRF2NyoRi16QXmGNJEh1TWy3xGo-0-966e4e44f46a412096b149eefe4dd7a4)
这两种头文件表示方法都是正确的,二者之间的区别如下:
●如果使用尖括号,那么系统会到存储C语言函数库的目录中寻找要包含的头文件。这是标准方式;
●如果使用双引号,那么系统会先在用户当前目录中寻找要包含的头文件,如果找不到,那么再到存储C语言函数库的目录中寻找要包含的头文件。
2.stdio.h
stdio.h是内存空间中的函数库之一,是C语言中的输入/输出函数库,包含各种各样的输入/输出函数(如printf()、gets()、putchar()函数等),所以在进行输入或输出操作时都需要使用这个函数库。
学习笔记
C语言中除了stdio.h函数库,还有很多函数库,具体函数库及其包含的函数可以参考相关函数手册。
1.3.2 主函数
构成C语言程序的基本单位是函数。在众多函数中,需要从一个函数打入程序内部,这个函数就是主函数,即main()函数。main()函数相当于汽车的车门,要驾驶汽车,首先需要从车门进入驾驶舱,也就是说,main()函数是可执行程序的入口函数,程序都是从main()函数开始执行的。main()函数的语法格式如下:
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt002_31.jpg?sign=1738819122-4HCWEezxzDuPsG2WU0P4KFaQi8ZClhR7-0-85e62df7318013d5247290f1e7bacca6)
main()函数前面的int表示主函数的返回类型,也就是需要返回一个整型数据,而程序的最后是return 0,说明0是函数的返回值。return 0是返回系统操作,表示程序正常退出。return语句通常写在程序的最后,表示这个程序结束了。
主函数可以不带参数,也可以带参数,如果使用带参数形式,那么需要有两个参数,第一个参数是int型,表示命令行中的字符串数,按照习惯(不是必须),将参数名称定义成argc(Argument Count);第二个参数是字符串型,表示一个指向字符串的指针数组,按照习惯(不是必须),将参数名称定义为argv(Argument Value)。
1.3.3 输出函数
输出是从内部到外部的传递过程。输出设备的种类有很多,如图1.24所示,这些输出设备输出的东西我们能看得见。
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt002_32.jpg?sign=1738819122-EdHLwxVBRKDYuC00Ync11elK27XY59nA-0-a1dabeb47a965c95e6513826a57d4f29)
图1.24 输出设备
C语言程序也是一样,代码在计算机内部进行编译,但是编译过程我们看不到,只有将编译结果输出到外部,我们才能看到。C语言程序需要一个媒介输出,即输出函数——putchar()函数、puts()函数及printf()函数。
1.putchar()函数
putchar()函数每次只能输出单个字符,该函数是stdio.h函数库中的函数,它的语法格式如下:
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt002_33.jpg?sign=1738819122-kZXpM2HfwGwJaiwuP3LuydjBSHTn7ccw-0-e8ec353d9d9245cc6ff6bc1dfb89c1fa)
其中的参数ch是要输出的字符,可以是字符型或整型变量,也可以是常量。例如:
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt002_34.jpg?sign=1738819122-8AU1oW7ZTmy6wE9eTBo5DBhqQi5mlQ8X-0-28304557310634bbf054f8dee0967061)
学习笔记
从这3行代码中可以看出,单个字符使用的是英文半角格式的单引号“''”。
putchar()函数的另一种形式是定义字符型变量并赋值,然后输出该字符。例如,利用putchar()函数输出字符拼成“小猪”的表情,具体代码如下(实例内容参考配套资源中的源码):
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt002_35.jpg?sign=1738819122-AfJFxGPbVMovKisWx6FyoTVEioSFcBLJ-0-f99ad34a009e04d6f152cb77d420e877)
运行上述程序,运行结果如图1.25所示。
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt002_36.jpg?sign=1738819122-g6YHrxiZohxJ3jooqRrtC3tTGadtdNWK-0-6a7afce8ee3145427a86ec426ef5fdb4)
图1.25 输出“小猪”表情
学习笔记
char是数据类型之一,表示字符型,具体知识将在第二章讲解;变量赋值是利用“=”赋值,表示将等号右侧的值赋给等号左侧的变量。
2.puts()函数
puts()函数一次可以输出多个字符,主要用于输出一个字符串,它也是stdio.h函数库中的函数,它的语法格式如下:
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt002_37.jpg?sign=1738819122-y6hZ0W084tJCzYInGGkeu1dAEOBu7Z71-0-9961d95ebdef795714bf2b40ecd4645f)
其中,字符指针变量str是形式参数,主要用于接收要输出的字符串。例如,使用puts()函数输出一个字符串常量,代码如下:
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt002_38.jpg?sign=1738819122-PSfmeXklDEgRiKoTY1P9E1o7EvHD9T33-0-ab2d57cb679e9f12c1e301d3dc23f4d4)
这行代码可以输出一个字符串,之后会自动进行换行操作。这与printf()函数(下面讲解具体用法)有所不同,在printf()函数中进行换行时,要在字符串中添加转义字符“\n”。puts()函数会在字符串中判断“\0”结束符,在遇到“\0”结束符后,后面的字符不再输出,并且自动换行。例如:
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt002_39.jpg?sign=1738819122-O4cS6oB7pOAHi62rCvtpZ2uAIdmD8OFX-0-0480f365e29bc0ff050ebc24f38fd092)
在加上“\0”结束符后,puts()函数输出的字符串就变成了“Welcome”。
学习笔记
●字符串使用的是英文半角格式的双引号“""”。
●编译器会在字符串常量的末尾添加结束符“\0”,因此puts()函数会在输出字符串常量后自动进行换行操作。
3.printf()函数
printf()函数是控制格式输出函数,它也是stdio.h函数库中的函数,它的语法格式如下:
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt002_40.jpg?sign=1738819122-VqvGj8tYAACRi5nBntYE6th39xL3xIhg-0-0215107db4f9b182f236116a84354c6c)
1)格式控制。
格式控制是用双引号括起来的字符串,又称为转换控制字符串,包括格式字符和普通字符共两种字符。
●格式字符主要用于进行格式说明,作用是将数据转换为指定的格式输出。格式字符是以“%”字符开头的。
●普通字符是需要原样输出的字符,包括双引号内的逗号、空格和换行符。
2)输出列表。
输出列表中列出的是要输出的数据,可以是变量,也可以是表达式。
例如:
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt002_41.jpg?sign=1738819122-6v3aYVzlGS2QzTYg6WeSO60nM97mzwpR-0-45f2fe2fc8e9c4c53c17e3aa90521a44)
运行以上代码,输出结果为“521 I Love You”。在格式控制的双引号中的字符是“%d I Love You”,其中的“I Love You”字符串中的字符是普通字符,而“%d”是格式字符,表示输出后面的iInt表示的数据。
printf()函数常用的格式字符如表1.1所示。
表1.1 printf()函数常用的格式字符
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt002_42.jpg?sign=1738819122-PR3vcKG2CqAE5G38SB58GVl1knPETHuL-0-5ac4fa6aafc61240fe0b3e239cc48127)
1.3.4 输入函数
输入是从外部到内部的传递过程。C语言程序使用输入函数实现输入功能。C语言中的输入函数有getchar()函数、gets()函数及scanf()函数。
1.getchar()函数
getchar()函数每次只能从终端(输入设备)输入一个字符,该函数是stdio.h函数库中的函数,它的语法格式如下:
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt002_43.jpg?sign=1738819122-WRslnNjAkLcPFFc29UjDXd7Cjreu4Kqp-0-26f3dadd44b03689c35031b031e045eb)
getchar()函数没有参数,该函数的值就是从输入设备得到的字符。例如,从输入设备得到一个字符,将其赋给字符变量cChar,代码如下:
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt002_44.jpg?sign=1738819122-e2Zdy52yy5nIjrJuUfLdG3J2wkW7HxWb-0-4fa90dc2cabbbb51e39f816626f58d90)
学习笔记
getchar()函数每次只能接收一个字符。getchar()函数得到的字符可以赋给一个字符变量或整型变量,也可以不赋给任何变量,还可以作为表达式的一部分。例如,“putchar(getchar());”表示将getchar()函数作为putchar()函数的参数,getchar()函数从输入设备得到字符,然后putchar()函数将字符输出。
例如,使用getchar()函数输入一个小写字母,输出对应的大写字母,具体代码如下(实例内容参考配套资源中的源码):
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt002_45.jpg?sign=1738819122-PrBmwXB9nwZ8T8KQlZ3qtcizxPcO1O5Y-0-da8e90b4102e77c418d9ee249df20f6f)
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt002_46.jpg?sign=1738819122-phZtlpBkaCb26yjgoXHvUcyR1yr3sqKx-0-c5b14dbde68c86a9ccc3b12643e83322)
运行上述程序,运行结果如图1.26所示。
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt002_47.jpg?sign=1738819122-KfetCbUpcmkBvB5AHjHphwNU7f8Jhh8k-0-0b112e934585f92ffce7e8774477c6ce)
图1.26 将输入的小写字母转换为大写字母
学习笔记
小写字母的ASCII码值比大写字母的ASCII码值大32。例如,小写字母a的ASCII码值是95,将数值95减去32得到数值65,ASCII码值65对应的是大写字母A。
2.gets()函数
gets()函数主要用于获取用户从终端(输入设备)输入的一个字符串,它也是stdio.h函数库中的函数,它的语法格式如下:
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt002_48.jpg?sign=1738819122-QYNRYYfpTR8gfIeQsTEuWqskfh5eeayg-0-7f3fc37f16eb08dfb892e40975046e1b)
其中,字符指针变量str是形式参数,主要用于存储读取的字符串。在读取字符串的过程中,当出现新的一行时停止读取。新的一行的换行字符会转换为字符串中的结束符“\0”。
例如,前面已经定义了字符数组变量cString,使用gets()函数获取输入字符数组的方式如下:
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt002_49.jpg?sign=1738819122-vd2K2MshbI45MGVY2Mbxzbbeq13EztMy-0-0c54bc29780be8bda06db7681c440b29)
3.scanf()函数
scanf()函数主要用于按照指定的格式接收用户从终端(输入设备)输入的数据,并且将输入的数据存储于指定的变量中,它也是stdio.h函数库中的函数,它的语法格式如下:
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt002_50.jpg?sign=1738819122-YK9v6asgA2rND7WLjqom2WrNArtVq3z4-0-ea8985ec1cf0fcf5f87de0b9b3d9f897)
scanf()函数的格式控制与printf()函数的格式控制相同。地址列表中的地址是接收数据变量的地址。例如,得到一个整型数据,具体代码如下:
![img](https://epubservercos.yuewen.com/9B6764/19471983208811106/epubprivate/OEBPS/Images/txt002_51.jpg?sign=1738819122-xjo0TcEojPPMiJkFKsTKz9CBywqpTQWK-0-d171a732c86c34ee013b45a7eedc36b3)
在这一行代码中,“&”符号表示取iInt变量的地址。在变量前加“&”符号,表示取该变量的地址。
学习笔记
scanf()函数在读取数据时不检查边界,因此Microsoft公司的Visual Studio开发工具提供了scanf_s()函数,它的功能与scanf()函数相同,Visual Studio开发工具认为scanf_s()函数更安全。