该审查代码了
让我们把代码拼在一起,回顾一下到目前为止你做了哪些事:
必须以这个顺序排列代码:在顶部包含头文件,这样编译器就能在编译代码前把所有函数都准备好。然后在开始写函数之前定义tracks
,这叫把tracks
数组放在全局域。全局变量位于任何函数之外,所有函数都可以调用它们。
最后,你有两个函数,find_track()
在前,main()
在后。find_track()
必须赶在你在main()
中调用它之前出现。
试驾
下面打开终端,看看代码能否工作。
好消息,程序工作了!
到目前为止,这个程序是你写过最长的一个,但它做了很多的事情。程序创建了一个字符串数组,并利用标准库中的字符串处理函数搜索数组中的歌名,最后找到了用户想要找的歌曲。
百宝箱
如果想了解更多关于string.h函数的信息,请参阅:http://tinyurl.com/82acwue。
如果你用的是Mac或Linux的计算机,可以在命令行中查看string.h中每个函数的详细介绍,假如想查看
strstr()
函数,可以输入:
- man strstr
这里没有蠢问题
问:为什么要把数组定义成
tracks[][80]
而不是tracks[5][80]
?答:也可以这样定义,但编译器知道列表有5项,所以你可以省略5,写成[]。
问:既然如此,为什么不直接写
tracks[][]
?答:每首歌的名字不一样长,为了放下最长的歌名,需要让编译器分配足够大的空间。
问:也就是说
tracks
数组中每个字符串都有80个字符?答:程序会为每个字符串分配80个字符,即使歌名很短。
问:所以
tracks
数组一共占了80×5=400字符?答:没错。
问:如果我忘了包含string.h这样的头文件会怎么样?
答:对于某些头文件来说,编译器会给出一个警告,但最后还是会包含它们;但对另一些来讲,编译器会直接提示编译错误。
问:为什么我们要把
tracks
数组定义在函数外面?答:我们把
tracks
放在全局域,全局变量可以在所有函数中使用。问:既然我们创建了两个函数,计算机会先运行哪一个?
答:程序总是首先运行
main()
函数。问:为什么我一定要把
find_track()
放在main()
之前?答:在调用函数前,编译器需要知道两件事,函数接收什么参数以及函数的返回类型是什么。
问:如果我把
main()
放到前面会怎么样?答:你会得到几个警告。
要点
可以用
char strings[…][…]
来创建数组的数组。第一组方括号用来访问外层数组。
第二组方括号用来访问每个内层数组中的元素。
有了string.h头文件,就可以使用C标准库中的字符串处理函数。
可以在一个C程序中创建多个函数,但计算机总是先运行
main()
。
代码冰箱贴
这群人正在为一款小游戏编写新的代码,他们创建了一个函数,可以倒过来显示字符串。但悲剧发生了,一部分冰箱贴乱了,你能帮助他们重组代码吗?
代码冰箱贴解答
一群人正在为一款小游戏编写新的代码。他们创建了一个函数,可以倒过来显示字符串。但悲剧发生了,一部分冰箱贴乱了,还好有你帮助他们重组代码。