该审查代码了

让我们把代码拼在一起,回顾一下到目前为止你做了哪些事:

该审查代码了 - 图1

必须以这个顺序排列代码:在顶部包含头文件,这样编译器就能在编译代码前把所有函数都准备好。然后在开始写函数之前定义tracks,这叫把tracks数组放在全局域。全局变量位于任何函数之外,所有函数都可以调用它们。

最后,你有两个函数,find_track()在前,main()在后。find_track()必须赶在你在main()中调用它之前出现。

该审查代码了 - 图2试驾

下面打开终端,看看代码能否工作。

该审查代码了 - 图3

好消息,程序工作了!

到目前为止,这个程序是你写过最长的一个,但它做了很多的事情。程序创建了一个字符串数组,并利用标准库中的字符串处理函数搜索数组中的歌名,最后找到了用户想要找的歌曲。

该审查代码了 - 图4

该审查代码了 - 图5百宝箱

如果想了解更多关于string.h函数的信息,请参阅:http://tinyurl.com/82acwue

如果你用的是Mac或Linux的计算机,可以在命令行中查看string.h中每个函数的详细介绍,假如想查看strstr()函数,可以输入:

  1. 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()放到前面会怎么样?

:你会得到几个警告。

 

该审查代码了 - 图6要点

  • 可以用char strings[…][…]来创建数组的数组。

  • 第一组方括号用来访问外层数组。

  • 第二组方括号用来访问每个内层数组中的元素。

  • 有了string.h头文件,就可以使用C标准库中的字符串处理函数。

  • 可以在一个C程序中创建多个函数,但计算机总是先运行main()

该审查代码了 - 图7代码冰箱贴

这群人正在为一款小游戏编写新的代码,他们创建了一个函数,可以倒过来显示字符串。但悲剧发生了,一部分冰箱贴乱了,你能帮助他们重组代码吗?

该审查代码了 - 图8

该审查代码了 - 图9代码冰箱贴解答

一群人正在为一款小游戏编写新的代码。他们创建了一个函数,可以倒过来显示字符串。但悲剧发生了,一部分冰箱贴乱了,还好有你帮助他们重组代码。

该审查代码了 - 图10