main()可以做得更多

用户有权修改程序的工作方式。对GUI程序来说,可以修改程序的首选项;而对于categorize这样的命令行程序,可以传给它命令行参数。

main()可以做得更多 - 图1

在C语言中,需要想办法知道数组的长度,所以main()函数有两个参数,argc的值用来记录数组中元素的个数。

命令行参数可以让程序更灵活,如果用户能调整程序的工作方式,就会觉得程序很有用。

下面就来修改categorize程序,让它变得更灵活。

main()可以做得更多 - 图2

用户运行程序时,命令行中第一个参数是程序名。

也就是说,第一个命令行参数其实是argv[1]

main()可以做得更多 - 图3代码冰箱贴

代码冰箱贴这是修改以后的categorize工具,程序从命令行读取搜索关键字和使用的文件,你能否把冰箱贴放到正确的位置?

用以下命令运行程序:

main()可以做得更多 - 图4

main()可以做得更多 - 图5代码冰箱贴解答

代码冰箱贴解答这是修改以后的categorize工具,程序从命令行读取搜索关键字和使用的文件,请把冰箱贴放到正确的位置。

用以下命令运行程序:

main()可以做得更多 - 图6

main()可以做得更多 - 图7试驾

好了,我们来试一下新的代码,你需要一个叫spooky.csv的测试文件。

main()可以做得更多 - 图8

运行categorize时,要用几个命令行参数告诉它查找哪些关键字以及使用哪些文件名:

main()可以做得更多 - 图9

程序运行以后,生成了以下文件:

main()可以做得更多 - 图10

main()可以做得更多 - 图11安全检查

在Head First实验室,我们从来不会犯错(咳咳)。但是在现实世界,当你在程序中打开文件准备读写时,最好检查一下有没有错误发生。好在如果数据流打开失败,fopen()函数会返回0,也就是说如果想检查错误,可以将下面这段代码:

  1. FILE in = fopen("我不存在.txt", "r");

改成这样:

  1. FILE in;
  2. if (!(in = fopen("我不存在.txt", "r"))) {
  3. fprintf(stderr, "无法打开文件.\n");
  4. return 1;
  5. }

Head First披萨屋耳闻

main()可以做得更多 - 图12

十个程序有九个需要选项。聊天程序有“系统设置”,游戏有调整难度的选项,而命令行工具需要有命令行选项。

命令行选项是一些小开关,它们经常出现在命令行工具中:

main()可以做得更多 - 图13