首页 C语言番外:如何给main函数传参?
文章
取消

C语言番外:如何给main函数传参?

上一篇讲了 main 函数的返回值,本篇讲一下 main 函数的参数,所以 main 函数肯定是可以有参数的,并且绝大多数的命令行程序的 main 函数都会用到参数。比如gcc -c main.c -o main.o,这个命令中后面的-c main.c -o main.o都会以参数的形式传递到 gcc 程序的 main 函数中。

在教科书里,能看到的 main 函数原型有这两种:

1
2
3
4
// 无返回值
void main();
// 有返回值
int main();

这两种形式都是可以的,除此之外还有一种带参数的 main 函数原型为:

1
int main(int argc, char *argv[]);

其中 argc 是 argument count 的缩写,代表参数的个数;argv 是 argument value 的缩写,代表参数值。

例如,在命令gcc -c main.c -o main.o中,argc 是 5,argv 是一个数组,第 0 个元素是启动本程序时使用的命令,在本例中为“gcc”,第 1 到第 4 个元素分别为:“-c”、“main.c”、“-o”和“main.o”。

可以通过下面的代码来测试命令行传递给 main 函数的参数:

1
2
3
4
5
6
7
8
#include <stdio.h>

int main(int argc, char *argv[]) {
    for (int i=0; i<argc; i++) {
        printf("%d, %s\n", i, argv[i]);
    }
    return 0;
}

Shell 命令常识

现在我们已经知道了如何在 main 函数中接收通过命令行传递过来的参数,仅仅能把这些参数打印出来是不够的,在学习如何使用这些参数前,有必要先普及一点 Shell 命令中的常识。所谓常识,当然是每个人都应该懂,尤其是作为本公众号的读者,更应该懂的东西,这部分常识可以通过学习 Linux 基础来学习。

Shell 命令中很多命令的参数都是非常自由的:

  1. 一个命令的选项通常有两个版本,一个长版本,一个短版本。
1
2
man --help
man -h

在这个例子中,--help-h的作用都一样,都是查看 man 命令的使用帮助。类似的还有很多,比如--verbose-v,通常是可以让一个命令的输出更详细。这里的常识是,如果是长选项(后面跟一个或多个单词)以两个‘-’开头,如果是短选项(一个字母)则以一个‘-’开头。

  1. 多个短版本的选项可以合并。
1
2
ls -a -l
ls -al

上面两个命令的作用也一样。这里的常识是,如果有多个短选项,像本例中的-a-l,可以合并写做-al

  1. 有的选项有值,有的选项没有值。

这个好理解吧,在本文开头的 gcc 的例子中,main.c 就是 -c 选项的值。

这里顺便再解释一下为什么长选项是以“–”开头,而短选项是以“-”开头,刚才也提到了,多个短选项可以合并,但是合并后的短选项还是以“-”开头,那如果长选项也以“-”开头的话,比如遇到一个选项为:“-help”,那就很难判断它代表一个长选项“help”,还是代表四个短选项的集合“-h -e -l -p”。当然再难的事程序员都有办法解决,比如解决思路就可以是先判断是否有长选项“help”,如果没有,则把它认为是四个短选项的集合。

好了,今天就先到这里。今天是元旦假期的最后一天,不知道大家元旦都过得怎么样?好像有的同学已经放假回家了,有的同学正在期末考试,考完试就能回家了。计科辅导员祝大家:每门考试不挂科,每次出行没疫情!

下期预告:这一期本来想讲一下既然命令行的选项如此多变,我们在代码里该怎么识别用户输入了哪些选项的,同时我也写了一部分代码,但是这部分代码还需要再优化一下,我希望可以尽量用最简单的代码说明问题,所以这部分内容就“下回分解”了。

本文由作者按照 CC BY 4.0 进行授权

C语言番外:main 函数为什么要`return 0;`?

C语言番外:标准输入输出到底是什么?