Getopt_long()函数带有自定义argc和argv

getopt_long() function with custom argc and argv

本文关键字:自定义 argc argv 函数 long Getopt      更新时间:2023-10-16

我在使用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,变量声明等)