C语言 argc和argv
argc
和argv
是最熟悉的陌生人。
为什么说他们熟悉,是因为如果你用的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
|
#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
|
哇,amazing,argc的值根据你的输入参数在自动修改,这就是argc的意思,就是命令行的个数统计。
下面看看argv的用法,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
#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
|
#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
| 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
|