执行程序时,可以从命令行传值给C程序。这些值被称为命令行参数,特别是想从外部控制程序,不是通过在代码内对这些值进行硬编码时,而是通过参数来控制代码部分逻辑。
1. main函数传参的意义
代码实例:
#include<stdio.h>
int main(int argc, char **argv)
{
int i;
printf("Total %d arguments\n", argc);
for(i = 0; i < argc; i++)
{
printf("%s\n", argv[i]);
}
return 0;
}
argc: 参数的个数,不给main()函数传递参数时默认值为1,即至少有一个参数为该可执行文件的文件名(含目录)。
argv: 为指针数组,分别指向各个字符串参数的首地址,其中argv[0]存储的是可执行文件的文件名的首地址。
运行结果:
$ ./test 1 2 3 adbd
Total 5 arguments
./test
1
2
3
adbd
2. 通过关键字传参,例如无顺序同时-v查看版本-h帮助
理解第一步,就能在实际应用中加入-v(参数)实现传递多参数,下面优点灵活、无顺序,只是按照关键字来传递参数。
2.1 代码实例
#include<stdio.h>
int main(int argc, char **argv)
{
int flags = 0;
while (1 + flags < argc)
{
if(argv[1+flags][0] == '-')
{
switch (argv[1+flags][1])
{
case 'a':
printf("%s: %s\n", argv[1+flags], argv[2+flags]);
break;
case 'b':
printf("%s: %s\n", argv[1+flags], argv[2+flags]);//argv[2+flags]需要传递进来的参数
break;
case 'c':
printf("%s: %s\n", argv[1+flags], argv[2+flags]);
break;
case 'd':
printf("%s: %s\n", argv[1+flags], argv[2+flags]);
break;
case 'v':
printf("Test version 1.0\n");
return 0;
case 'h':
case 'H':
printf("test [-a] [-b] [-c] [-d] [-v] [-h]\n");
break;
default:
break;
}
}
flags++;
}
return 0;
}
2.2 通过命令行参数多个传参
运行结果如下:
$ ./test -a 123 -b 456 -c adc -d def
-a: 123
-b: 456
-c: adc
-d: def
$ ./test -b 115200
-b: 115200
$ ./test -d /dev/ttyUSB0 -b 115200
-d: /dev/ttyUSB0
-b: 115200
如上面的例子, -b用来识别此项 设置是波特率,后面的115200是设置的波特率;-d用来识别此项 设置是串口的设备节点,后面的/dev/ttyUSB0是串口的设备节点,这样就能实现命令行参数。
2.3 通过命令行参数查看版本
运行结果如下:
$ ./test -v
Test version 1.0
2.4 通过命令行参数查看帮助
运行结果如下:
$ ./test -H
test [-a] [-b] [-c] [-d] [-v] [-h]