当前位置:  开发笔记 > 编程语言 > 正文

命令行处理库 - getopt

如何解决《命令行处理库-getopt》经验,为你挑选了1个好方法。

有人可以帮我解决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调用,它就可以了.

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



1> Diego Sevill..:

argv1和2必须以0结尾:

char* argv1[] = {"par1", "par2", 0};

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

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

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


注意:POSIX标准没有说明将optind重置为1会将getopt()重置为初始状态,特别是如果你没有完全解析第一个参数.例如,如果第一个参数是-xy并且在处理x后停止,则无法保证optind的重置有效.
推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有