我在使用getopt_long()函数与自定义argc和argv时遇到了麻烦。
我接收字符串形式的参数,而不是真正的命令行参数。然后从这个字符串构建new_argc和new_argv,并与getopt_long()一起使用。但是getopt_long()本身在第一次调用时失败。返回EOF和optarg = NULL
string is "-c 10.30.99.41"
new_argc = 3
new_argv[0]=>./prog_name
new_argv[1]=>-c
new_argv[2]=>10.30.99.41
如果我传递命令行参数,getopt_long工作对我来说是OK的。所以我的做空和做多选择是正确的。但是如果我传入new_argc和new_argv,它就失败了
我确信我的短期和长期选项是正确的,argv是NULL终止。我很抱歉我不能在这里张贴更多的代码。
我怀疑getopt_long是否可以与自定义argc和argv一起使用。我怀疑它只适用于一个真正的argc和argv,因为它必须引用一些其他代码在libc与argc,argv。任何评论?
option = getopt_long( new_argc, new_argv, short_options, long_options, NULL );
EDIT:
"变量optind是argv中要处理的下一个元素的索引。系统初始化该值为1。调用者可以将其重置为1以重新扫描相同的argv,或者在扫描新的参数向量时。"
所以,是的。您可以使用getopt_long再次扫描参数或另一个参数列表。但是,如果之前有人调用了getopt_long,则必须将全局opind变量设置回1。
请记住,main()中的argv
是NULL终止的,argc
是长,即;argv[argc] == NULL。因此,您可能必须确保自己的new_argv
中的最后一个元素是NULL指针。
(注意,请在发布时显示所有相关代码,很难猜测错误是什么,例如显示short_options
, long_option
是什么,您实际如何构建new_argv,变量声明等)