大一时候学校有个学习分享会,有一个学长问了一句:”C你们应该都学完了,那你们知道main函数有多少个参数吗?那些参数有什么用?”

刚才在计组课间看linux.cn 上有一篇文章叫《如何写好 C main 函数》,让我再次想起学长所问,虽然知道main 函数是有参数的,只知道有两个,没有深究。

三个参数

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

int main(int argc, char *argv[], char *env[]) {
(void)argc, (void)argv, (void)env;
return 0;
}

用void 就是让我的vim 不要有讨厌的黄色高亮警告。哈哈。如果我没有第四行那句,就会有”讨厌”的警告。

argc和argv

在B站看刘意老师讲 Java 的时候,他有提到过 Java 的 main 函数的那个String[] args是在 Java 刚出来的时候没有 Scanner 类,所以通过这种方式来获取输入的参数。

在 C 中这两个参数就是获取命令行传入的参数的,比如在用ls -al的时候,后面的就作为参数传给了ls程序。

  • argc参数个数参数向量的个数
  • argv参数向量字符指针数组

写个程序来试试。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

int main(int argc, char *argv[], char *env[]) {

(void)env;

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

return 0;
}

输出

当然在Windows下也是同样的,下面的图片来源于CSDN博客:

env

env 是用来获取环境变量的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

int main(int argc, char *argv[], char *env[]) {

// (void)env;

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

(void)argc, (void)argv;
int i = 0;
for (i = 0; env[i] != NULL; i++) {
printf("%d : %s\n", i, env[i]);
}

return 0;
}

输出:

补充通过第三方变量获取环境变量

libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>

int main(int argc, char *argv[], char *env[]) {

// (void)env;

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

(void)argc, (void)argv;
// int i = 0;
// for (i = 0; env[i] != NULL; i++) {
// printf("%d : %s\n", i, env[i]);
// }

extern char** environ;
int i = 0;
for (i = 0; environ[i] != NULL; i++) {
printf("%d : %s\n", i, environ[i]);
}

return 0;
}

得到的输出和上面是一样的。