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;
               }
       }
}
posted @ 2021-11-02 09:14  xfw121  阅读(389)  评论(0)    收藏  举报