有人可以帮我getopt函数的?

当我在做主要如下:

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;
    }
}

我上运行RHEL3此代码,使用旧的libc版本。我不知道哪一个是准确的。

现在的问题是getopt的不与argv2工作的第二次。 但是,如果我注释掉与argv1第一getopt的呼叫,它的工作原理。

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

有帮助吗?

解决方案

argv1和2必须在0结束:

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

修改的:OK,我读了getopt的手册页,我发现这一点:

  

变量OPTIND是argv中要处理的下一个元素的索引。系统初始化该值          为1调用者可以将其重置为1以重新启动同样的argv扫描或扫描新的参数向量时。

所以,在getopt的在两个通话之间进行OPTIND = 1使得正常工作。

其他提示

getopt()函数使用一些全局变量,像optindoptarg,存储呼叫之间的状态信息。处理完一组选项之后,有在那些导致与下一组选项问题变量的数据左。你可能会尝试通过清除变量重置调用之间getopt的状态,但我不知道这工作,因为函数可以使用未记录的其他变量,你永远不会知道你会得到他们所有;此外,它是绝对不可移植的(即如果getopt()变更的实现,你的代码休息)。见href="http://linux.die.net/man/3/getopt" rel="nofollow的细节noreferrer">手册页的getopt()超过一组参数,在给定的程序,如果你能帮助它。

我不知道是否有重置getopt的状态(或者功能,它可以让您保存在自己的变量状态的折返版)...我似乎记得看到类似的东西的实际功能一次,但我现在不能说我期待找到它: - /

如在手册页指出:

“,它可以扫描多个参数向量,或重新扫描同一载体一次以上,并且希望利用GNU扩展,例如‘+’和所述的节目‘ - ’在optstring的开始,或者改变POSIXLY_CORRECT的值扫描之间,必须通过复位OPTIND为0,而不是1。传统值重新初始化getopt的()(重新设定为0,迫使其重新检查POSIXLY_CORRECT和检查GNU扩展在optstring内部初始化例程的调用。)“

是否有你为什么不使用getopt_long(),而不是任何理由?在大多数平台上,getopt的()只是调用_getopt_long()与开关禁用长篇大论。这是几乎每一个平台,我所知道的(仍在使用),包括Linux,BSD,甚至出现OS的喜欢HELENOS的情况下 - ,我知道,我是谁移植的getopt它的libc中的一个:)

有使用你的程序至少有长选项,直到他们习惯使用它的任何人要容易得多。

getopt_long()将允许你使用两个(或更多)选项的索引,可以留“活”他们这样做处理参数,只有内部(全局,非折返)后,人们将不得不重新一套是没有大问题。

这可以让你轻松地比较参数计数到与许多其他好处都调用实际传递的选项数目..请不使用过时的接口考虑。

看getopt.h,你就会明白我的意思。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top