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

Posted

技术标签:

【中文标题】带有自定义 argc 和 argv 的 getopt_long() 函数【英文标题】:getopt_long() function with custom argc and argv 【发布时间】:2011-12-17 10:00:12 【问题描述】:

我在使用时遇到问题。

我以字符串而不是真正的命令行参数接收我的参数。然后从这个字符串构建一个 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 对我来说可以。所以我的短期和长期选择是正确的。但是如果我通过 new_argc 和 new_argv 它会失败。

我确信我的短选项和长选项是正确的,并且 argv 是 NULL 终止的。我很抱歉我不能在这里发布更多代码。

我怀疑 getopt_long 是否可以与自定义 argc 和 argv 一起使用。我怀疑它只适用于真正的 argc 和 argv,因为它必须引用 libc 中与 argc、argv 相关的一些其他代码。有cmets吗?

option = getopt_long( new_argc, new_argv, short_options, long_options, NULL );

【问题讨论】:

您要发布字符串是什么以及如何使用它来构建列表吗? @anoop,optstring 参数呢?你能发布调用getopt_long()的代码吗? 我不知道这是否会有所作为,但如果你想模拟 main() 的真实调用方式,new_argv[4] 应该为 0。 谢谢,argv 是 NULL 终止的。 @anoop 如果你只是展示真实的代码,那会更明显。 【参考方案1】:

编辑:

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

所以,是的。您可以使用 getopt_long 再次扫描参数或另一个参数列表。但是,如果之前有人调用了 getopt_long,则必须将全局 optind 变量设置回 1。

请记住 main() 中的 argv 是 NULL 终止的,并且 argc 长,即; argv[argc] == NULL。因此,您可能必须确保您自己的 new_argv 中的最后一个元素是 NULL 指针。

(注意,请在发帖时显示所有相关代码,很难猜出错误是什么,例如显示short_optionslong_option 是什么、您实际构建new_argv 的方式、变量声明等)

【讨论】:

一针见血,谢谢,非常感谢。 optind = 0 或 1 修复它。 getopt_long 之前使用过。

以上是关于带有自定义 argc 和 argv 的 getopt_long() 函数的主要内容,如果未能解决你的问题,请参考以下文章

在主函数中重命名 argc 和 argv 是不是安全?

用常量参数定义 main (const int argc, const char * const argv[])?

为啥 main(int argc, char* argv[]) 需要两个参数? [复制]

自定义 Qt 小部件

PHP 5.4 未定义索引:argv

argc 和 argv 的目的是啥? [复制]