命令行处理库 - getopt

5 c getopt

有人可以帮我解决getopt功能吗?

当我在main中执行以下操作时:

char *argv1[] = {"testexec","-?"};
char *argv2[] = {"testexec","-m","arg1"};
int  cOption;
/* test for -? */

setvbuf(stdout,(char*)NULL,_IONBF,0);
printf("\n argv1 ");
while (( cOption = getopt (2, argv1, "m:t:n:fs?")) != -1) {
    switch(cOption){
        case 'm':
            printf("\n -m Arg : %s \n",optarg);
            break;
        case '?':
            printf("\n -? Arg ");
            break;
        case 'n':
            printf("\n -n Arg : %s \n",optarg);
            break;
    }
}

printf("\n argv2 ");

while (( cOption = getopt (3, argv2, "m:t:n:fs?")) != -1) {
    switch(cOption){
        case 'm':
            printf("\n -m Arg : %s \n",optarg);
            break;
        case '?':
            printf("\n -? Arg : %s \n",optarg);
            break;
        case 'n':
            printf("\n -n Arg : %s \n",optarg);
            break;
    }
}

我在使用旧libc版本的rhel3上运行此代码.我不知道哪一个是准确的.

现在问题是getopt不能第二次使用argv2.但是如果我用argv1注释掉第一个getopt调用,它就可以了.

谁能告诉我我在这里做错了什么?

Die*_*lla 12

argv1和2必须以0结尾:

char* argv1[] = {"par1", "par2", 0};
Run Code Online (Sandbox Code Playgroud)

编辑:好的,我读了getopt手册页,我发现了这个:

变量optind是argv中要处理的下一个元素的索引.系统将此值初始化为1.调用者可以将其重置为1以重新开始扫描相同的argv,或者扫描新的参数向量.

因此,在getopt的两次调用之间使optind = 1使其按预期工作.

  • 注意:POSIX标准没有说明将optind重置为1会将getopt()重置为初始状态,特别是如果你没有完全解析第一个参数.例如,如果第一个参数是-xy并且在处理x后停止,则无法保证optind的重置有效. (2认同)