寻找真命天子……

到目前为止,你已经用过了书中很多C函数,事实上还有很多方法可以让它们变得更强大,只要学会正确使用这些方法,就可以用更少的代码做更多的事。

怎么做?我们来看一个例子。假设你想过滤某个字符串数组中的数据,只显示其中部分字符串:

  1. int NUM_ADS = 7;
  2. char *ADS[] = {
  3. "William: SBM GSOH likes sports, TV, dining",
  4. "Matt: SWM NS likes art, movies, theater",
  5. "Luis: SLM ND likes books, theater, art",
  6. "Mike: DWM DS likes trucks, sports and bieber",
  7. "Peter: SAM likes chess, working out and art",
  8. "Josh: SJM likes sports, movies and theater",
  9. "Jed: DBM likes theater, books and dining"
  10. };

寻找真命天子…… - 图1

下面来写代码,用字符串函数过滤数组。

寻找真命天子…… - 图2代码冰箱贴

请完成find()函数,用它过滤出列表中所有运动迷,同时他们不能是Bieber的粉丝。

注意:有的代码片段可能不会用到。

寻找真命天子…… - 图3

寻找真命天子…… - 图4代码冰箱贴解答

请完成find()函数,用它过滤出列表中所有运动迷,同时他们不能是Bieber的粉丝。

寻找真命天子…… - 图5

寻找真命天子…… - 图6试驾

假如把函数和数据都放在一个叫find.c的文件中,就可以像这样编译并运行程序:

寻找真命天子…… - 图7

和预期一样,find()函数循环遍历了数组,然后找到了匹配的字符串。既然有了基本代码,就不难复制出搜索其他内容的函数。

寻找真命天子…… - 图8

没错,复制函数会产生很多重复代码。

C程序经常会执行一些大同小异的任务,现在find()函数为了搜索匹配字符串,会遍历数组中所有元素,并测试每个字符串,而这些测试会写死在代码中,也就是说函数永远只能做一种测试。

当然也可以把字符串作为参数传递给函数,让函数搜索不同的子串,但这样find()还是无法检查3个字符串,比如“arts”、“theater”和“dining”。你需要的是一种截然不同的技术。

你需要更高端的东西……