main函数命令行参数解析编程
应用场景
在编写底层程序时,我们通常使通过命令行设置参数选项来实现与程序的交互,从而完成程序的各个测试。getopt()是一个专门设计来减轻命令行处理负担的库函数。
Linux命令行规范
一般命令组成为
命令名 选项 参数 ...
命令名
- 程序名应只包含小写字母和阿拉伯数字
选项
-
选项名应该是单字符或单数字,且以短横‘-‘为前綴,如-l,-p等等。
-
多个不需要选项参数的选项,可以合并
-
选项与其参数之间用空白符隔开
-
选项应该在参数出现之前出现
长选项
GNU鼓励程序员使用--help、--verbose等形式的长选项。这些选项不仅不与POSIX约定冲突,而且容易记忆,另外也提供了在所有GNU工具之间保持一致性的机会。GNU长选项有自己的约定:
- 对于已经遵循POSIX约定的GNU程序,每个短选项都有一个对应的长选项
- 长选项可以缩写成保持惟一性的最短的字串
- 选项参数与长选项之间或通过空白字符活通过一个'='来分隔
命令行处理技术
当 C 运行时库的程序启动代码调用 main() 时,已经对命令行进行了处理。argc 参数包含参数的计数值,而 argv 包含指向这些参数的指针数组。argv[0]是程序名。然后通过命令行参数解析函数 —— getopt()来完成命令行解析。
getopt()函数使用
基本结构
- 声明
![image]()
- 该函数的argc和argv参数通常直接从main()的参数直接传递而来。optstring是选项字母组成的字串。
- 返回值
![image]()
- 全局变量
![image]()
基本使用
-
主要注意
"a🅱️cd::e",这就是一个选项字符串。对应到命令行就是-a ,-b ,-c ,-d, -e 。冒号又是什么呢? 冒号表示参数,一个冒号就表示这个选项后面必须带有参数(没有带参数会报错哦),但是这个参数可以和选项连在一起写,也可以用空格隔开,比如-a123 和-a 123(中间有空格) 都表示123是-a的参数;两个冒号的就表示这个选项的参数是可选的,即可以有参数,也可以没有参数,但要注意有参数时,参数与选项之间不能有空格(有空格会报错的哦),这一点和一个冒号时是有区别的。 -
基本使用
#include <unistd.h>
#include <stdio.h>
int main(int argc, char * argv[])
{
int ch;
printf("\n\n");
printf("optind:%d,opterr:%d\n",optind,opterr);
printf("--------------------------\n");
while ((ch = getopt(argc, argv, "ab:c:de::")) != -1)
{
printf("optind: %d\n", optind);
switch (ch)
{
case 'a':
printf("HAVE option: -a\n\n");
break;
case 'b':
printf("HAVE option: -b\n");
printf("The argument of -b is %s\n\n", optarg);
break;
case 'c':
printf("HAVE option: -c\n");
printf("The argument of -c is %s\n\n", optarg);
break;
case 'd':
printf("HAVE option: -d\n");
break;
case 'e':
printf("HAVE option: -e\n");
printf("The argument of -e is %s\n\n", optarg);
break;
case '?':
printf("Unknown option: %c\n",(char)optopt);
break;
}
}
}




浙公网安备 33010602011771号