首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C++中getopt函数的混淆

C++中getopt函数的混淆
EN

Stack Overflow用户
提问于 2020-04-06 22:41:55
回答 1查看 258关注 0票数 0

我用getopt函数写了一个代码,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<ctype.h>

int main(int argc, char *argv[]){
    int result;
    opterr=0;
    puts("The following parsed outcome to command-line argments by getopt(-a, -b* or -c*):");
    while((result=getopt(argc, argv, "ab:c::"))!=-1){
        switch(result){
        case ':':
            printf("getopt returns \'%c\'\toptopt=%c\toptarg=%s\toptind=%d\t", result, optopt, optarg, optind);
            break;
        case '?':
            if(optopt=='b')
                fprintf(stderr, "Option -%c requires an argument attached. optarg=%s\toptind=%d\t", optopt, optarg, optind);
            else if(isprint(optopt))
                fprintf(stderr, "Unknown option \'%c\'.\toptarg=%s\toptind=%d\t", optopt, optarg, optind);
            else
                fprintf(stderr, "Unknown option character \'%x\'.\toptarg=%s\toptind=%d\t", optopt, optarg, optind);
            break;
        default:
            printf("getopt returns \'%c\'\toptarg=%s\toptind=%d\t", result, optarg, optind);
            break;
        }
        printf("argv[%d]=%s\n", optind, argv[optind]);}

    puts("Here is parsed argument values:");
    for(result=1; result<argc; result++)
        printf("argv[%d]=%s\n", result, argv[result]);
    for(; optind<argc; optind++)
        printf("No-option argument values: argv[%d]=%s\n", optind, argv[optind]);
    return 0;
}

然后将上面的程序编译成可执行文件parse。使用以下命令行参数运行parse:

代码语言:javascript
代码运行次数:0
运行
复制
./parse -ac b

下面是输出:

代码语言:javascript
代码运行次数:0
运行
复制
  The following parsed outcome to command-line argments by getopt:
  getopt returns 'a'      optarg=(null)   optind=1        argv[1]=-ac
  getopt returns 'c'      optarg=(null)   optind=2        argv[2]=b
  Here is parsed argument values:
  argv[1]=-ac
  argv[2]=b
  No-option argument values: argv[2]=b

我感到困惑的是,为什么getoptargv[1] ac中遇到c时会返回c。因为那不是-c。在我看来,它应该执行语句case '?':

EN

回答 1

Stack Overflow用户

发布于 2020-04-06 22:54:52

使用getopt时,不带参数的单字符选项可以与以下选项组合使用。这就是为什么可以输入

代码语言:javascript
代码运行次数:0
运行
复制
ls -lR

即使下面的选项带有参数,这也是有效的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61062364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档