getopt_long函数小疑问

limlzm 2005-08-04 03:36:07
getopt_long通常都是在main函数用,检查命令行-和--参数。具体我就不一一说了。
问题是这样的:
我把main函数改装成一个函数调用,test_main()我想模拟argv[]和argc,把整理好的参数再调用test_main函数,问题来了,当第一次调用这个函数的时候,getopt_long返回的值都是我预期得到的结果,就是正确。但再调用第二次test_main函数时候,发现getopt_long返回的值是-1。我就不太清楚,为什么会不行?
各位有遇到过这样的问题吗?
...全文
427 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
limlzm 2005-08-11
  • 打赏
  • 举报
回复
问题已经解决,方法重整一下源码,调用前初始化
__getopt_initialized = 0;//如果是1的话是不会获取optstring
last_nonopt = 1; //后一个参数把他重置回第一个
first_nonopt = 1; //前一个参数把他重置回第一个
optind = 1; //初始argv[],可以为0,不过程序是不读取argv[0]

谢谢楼上各位帮助,结贴
Wolf0403 2005-08-09
  • 打赏
  • 举报
回复
getopt / getopt_long 操作的时候会对几个库中的静态变量进行修改,因此这个函数是不可重入的。如果希望多次调用,我猜测可能需要手工回复那些静态变量之后才可以。

optopt, optind, optarg 等
limlzm 2005-08-09
  • 打赏
  • 举报
回复
我觉得也只能是这种解释,谢了阿
limlzm 2005-08-08
  • 打赏
  • 举报
回复
好像以前有个帖子提前的功能,怎么现在没了?
limlzm 2005-08-05
  • 打赏
  • 举报
回复
先谢谢楼上的帮助,不过我想和结构无关,因为第一次调用是正常的,但第二次调用才出错,可惜看不到源码。
jixingzhong 2005-08-04
  • 打赏
  • 举报
回复
根据上面的规定,

修改如下: (试试 )

static struct option long_options[] =
{
{"add", 1, NULL, 0},
{"append", 0, NULL, 0},
{"delete", 1, NULL, 0},
{"verbose", 0, NULL, 0},
{"create", 1, NULL, 0},
{"file", 1, NULL, 0},
{0, 0, NULL, 0}
};
jixingzhong 2005-08-04
  • 打赏
  • 举报
回复
要使用getopt_long()这个函数,我们需要提供两个数据结构,第一个是一个字符串,该字符串中的每个字符来表示短形式的选项,如果某个选项后面需要跟一个参数,那么就需要在这个字符后面加上一个“:”(冒号)。

为了定义长形式表达的选项,我们需要定一个结构体数组。数组的每一项与一个长形式的参数相关,每项包括四个参数:通常来说,第一项是长形式的选项的字符串表达;第二项与后面是否有参数提取有关,如果后面有参数需要处理就是1,否则是0;第三项是NULL;最后一项则是与长形式相关联的短形式表达的字符。另外,这个数组的最后一项必须全部置为0。
limlzm 2005-08-04
  • 打赏
  • 举报
回复
我贴个大概把,源码太多,不好贴。
//从网上拿来的例子
int test_main (argc, argv)
int argc;
char **argv;
{
int c;
int digit_optind = 0;

while (1)
{
int this_option_optind = optind ? optind : 1;
int option_index = 0;
static struct option long_options[] =
{
{"add", 1, 0, 0},
{"append", 0, 0, 0},
{"delete", 1, 0, 0},
{"verbose", 0, 0, 0},
{"create", 1, 0, 'c'},
{"file", 1, 0, 0},
{0, 0, 0, 0}
};

c = getopt_long (argc, argv, "abc:d:012",
long_options, &option_index);
if (c == -1)
break;

switch (c)
{
case 0:
printf ("option %s", long_options[option_index].name);
if (optarg)
printf (" with arg %s", optarg);
printf ("\n");
break;

case '0':
case '1':
case '2':
if (digit_optind != 0 && digit_optind != this_option_optind)
printf ("digits occur in two different argv-elements.\n");
digit_optind = this_option_optind;
printf ("option %c\n", c);
break;

case 'a':
printf ("option a\n");
break;

case 'b':
printf ("option b\n");
break;

case 'c':
printf ("option c with value `%s'\n", optarg);
break;

case 'd':
printf ("option d with value `%s'\n", optarg);
break;

case '?':
break;

default:
printf ("?? getopt returned character code 0%o ??\n", c);
}
}

if (optind < argc)
{
printf ("non-option ARGV-elements: ");
while (optind < argc)
printf ("%s ", argv[optind++]);
printf ("\n");
}

exit (0);
}
int ex_verbose()
{
int argc = 2,r;
char *argv[] = {"test", "--verbose"};

r = test_main( (int )argc, (char **) argv );

return r;

}
//main
int
main(int argc, char **argv)
{
ex_verbose();//成功
ex_verbose();//失败

return 0;
}
这是改装后的代码,没编译过,大概架构是这样,有谁深入了解过getopt_long,有源码就更好。
PMsg 2005-08-04
  • 打赏
  • 举报
回复
代码贴出来看看

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧