关于getopt_long和getopt函数中optind变量

static const char g_shortopts [] = ":d:vh";

static void usage(FILE *fp, int argc, char **argv) {
    fprintf(fp,
            "Usage: %s [options]\n\n"
            "Options:\n"
            " -d | --device        Device \n"
            " -v | --version       Display version information\n"
            " -h | --help          Show help content\n\n"
            "", basename(argv[0]));
}

while ((c = getopt_long(argc, argv, g_shortopts, g_longopts, NULL)) != -1) {
        switch (c) {
        case 'd':
            dev = optarg;
            break;

        case 'v':
            /* Display the version */
            printf("version : 1.0\n");
            break;

        case 'h':
            usage(stdout, argc, argv);
            break;
                
        default :
            flag = 1;
            break;
        }
}

optind初始值为1

   ①如果命令行指令正确

    1.命令行指令不带参数,则optind为不带参数指令的索引值,在循环getopt函数中会一直加1至到最后一个指令,例如./test -h -h -h,optind索引值为2,3,4.

    2.命令行指令带参数,则optind为指令参数的索引值,在循环getopt函数中会一直加到最后一个指令,例如./test -d 1 -d 2 -d 3,optind索引值为3,5,7.

   ②如果命令行指令错误

    1.命令行指令是不带'-'指令,则optind不变,改变argv字符串数组内变量顺序,argv[0]被指令取代,例如./test 1 2 3 4,optind索引值为1,,结束后会将optind重新赋值为1,argv字符串数组为{"1","2","3","4"}

    2.命令行指令是带'-'指令,则optind会加1,在循环getopt函数中会一直加1至到最后一个参数,例如./test -a -b -c -d,optind索引值为2,3,4,5.

    3.命令行指令带'-'指令和不带'-'指令混杂,在循环getopt函数中会跳过不带'-'的指令,并且循环结束后改变optind为去除不带'-'指令的个数,并改变argv字符串数组内变量顺序,将带'-'参数按顺序提前,不带'-'参数按顺序推后,例如./test -a 1 -b 2 -c 3,optind索引值为2,4,6,结束后会将optind重新赋值为4,并且argv字符串数组为{"./test","-a","-b","-c","1","2","3"}

   ③如果命令行指令正确和错误混杂

    1.命令行指令中错误指令只有不带'-'参数,与②的1结果一致,例如./test 1 -d 2 4 -d 3,optind索引值为4,7,结束后会将optind重新赋值为5,argv字符串数组为{"-d","2","-d","3","1","4"}

    2.命令行指令中错误指令存在带'-'参数,与②的3结果一致

总结规律:

        1.optind,不带'-'指令跳过,带'-'指令不带参数则加1,带'-'指令且带参数则加2

        2.argv字符串数组变量顺序,只有不带'-'错误指令和不带'-'错误指令和正确指令混杂时argv[0]被指令取代;命令行指令带'-'指令和不带'-'指令混杂时,将带'-'参数按顺序提前,不带'-'参数按顺序推后

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值