0%

C语言 argc和argv

C语言 argc和argv

argcargv是最熟悉的陌生人。

为什么说他们熟悉,是因为如果你用的IDE比较多,大部分的main函数的样子是这样子的int main(int argc, char *argv[])

说它们陌生是因为,你可能写了半年的程序也没有实际用过这两个参数,不明所以。

好的,先来说说它们的叫法,或许也不对:

  • argc:argument counter,读作arg - C,是一个整型
  • argv:argument vector,读作 arg-V,是一个二维字符数组

具体什么意思呢,还记不记得前面说的scanf,可以采集键盘输入,恩,运行程序,然后等待我们输入,这两个参数的含义是在运行程序的时候就直接输入,比如,有两个程序bigger和smaller,我想后面直接跟两个参数来输入较大值 或者较小值,用法如下:

1
2
$ ./bigger 5 4
$ ./smaller 15 23

这个时候就需要argc和argv了。

比如下面这个例子:

1
2
3
4
5
6
7
8
9
10
/*beginner/argcargv/argcargv1.c*/

#include <stdio.h>

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

编译运行:

1
2
3
4
5
6
7
8
9
10
11
12
$ ./argcargv1 
argc = 1
$ ./argcargv1 1
argc = 2
$ ./argcargv1 1 2
argc = 3
$ ./argcargv1 1 2 3
argc = 4
$ ./argcargv1 1 2 3 4
argc = 5
$ ./argcargv1 1 2 3 4 1234
argc = 6

哇,amazingargc的值根据你的输入参数在自动修改,这就是argc的意思,就是命令行的个数统计。

下面看看argv的用法,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
/*beginner/argcargv/argcargv2.c*/

#include <stdio.h>

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

这里有个需要留意的地方,就是我们在使用argv的时候需要配合argc,因为这就涉及到数组溢出的issue了。

结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ ./argcargv2 1
argv are :
argv[0] = ./argcargv2
argv[1] = 1
$ ./argcargv2 1 2
argv are :
argv[0] = ./argcargv2
argv[1] = 1
argv[2] = 2
$ ./argcargv2 1 2 34
argv are :
argv[0] = ./argcargv2
argv[1] = 1
argv[2] = 2
argv[3] = 34

综上,我们就可以写个bigger的demo程序了,先自己想想如何写。


代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*beginner/argcargv/argcargv3.c*/

#include <stdio.h>
#include <stdlib.h>

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

if (argc != 3)
{
printf("Usage :\n");
printf(" ./argcargv3 num1 num2\n");
exit(0);
}

if (atoi(argv[1]) > atoi(argv[2]))
printf("Bigger is %d\n", atoi(argv[1]));
else
printf("Bigger is %d\n", atoi(argv[2]));
return 0;
}

测试如下:

1
2
3
4
5
6
7
8
9
$ ./argcargv3
Usage :
./argcargv3 num1 num2

$ ./argcargv3 3 6
Bigger is 6

$ ./argcargv3 9 6
Bigger is 9

哇哦,又来了一点新东西,首先头文件加了stdlib,这个主要是因为使用了函数atoi,这个函数的含义就是把字符转换为数字,因为命令行参数的类型是char *的,所以在进行比较的时候要转换为整数。

编译运行

直接输入make就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#beginner/argcargv/Makefile
ALL : argcargv1 argcargv2 argcargv3

argcargv1: argcargv1.c
gcc -o argcargv1 argcargv1.c

argcargv2: argcargv2.c
gcc -o argcargv2 argcargv2.c

argcargv3: argcargv3.c
gcc -o argcargv3 argcargv3.c

.PHONY : clean

clean:
rm -f argcargv1 argcargv2 argcargv3
处无为之事,行不言之教;作而弗始,生而弗有,为而弗恃,功成不居!

欢迎关注我的其它发布渠道