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

发布于 2024-12-13 03:02:45 字数 707 浏览 0 评论 0原文

我在使用带有自定义 argc 和 argv 的 getopt_long() 函数时遇到问题。

我以字符串形式接收参数,而不是真正的命令行参数。然后根据该字符串构建 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 相关的其他代码。有什么意见吗?

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

I am having trouble using getopt_long() function with custom argc and argv.

I receive my arguments in a string instead of the real command line args. Then a new_argc and new_argv was built from this string to be used with getopt_long(). But getopt_long() fails on the first call itself. returns EOF and 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 works OK for me if I pass command line args. So my short and long options are correct. But if I pass the new_argc and new_argv it fails.

I am sure my short and long options are right and the argv is NULL terminated. I apologize I cant post more code here.

I doubt if getopt_long can be used with a custom argc and argv. I suspect it works only with a real argc and argv because it must be referencing some other code in libc related to argc,argv. Any comments?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

嘿哥们儿 2024-12-20 03:02:45

编辑:

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

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

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

(注意,请在发布时显示所有相关代码,很难猜测错误是什么,例如显示 short_optionslong_option 是什么,您实际上如何构建 new_argv,变量声明等)

EDIT:

"The variable optind is the index of the next element to be processed in argv. The system initializes this value to 1. The caller can reset it to 1 to restart scanning of the same argv, or when scanning a new argument vector."

So, yes. You can use getopt_long to scan the arguments or another argument list again. However, if someone has called getopt_long previously, you have to set the global optind variable to back to 1.

Remember that the argv in main() is NULL terminated and argc long, that is; argv[argc] == NULL. So you likely have to make sure the last element in your own new_argv is a NULL pointer.

(Note, please show all the relevant code when posting, it's hard to guess what the error is, e.g. showing what short_options, long_option is, how you actually build your new_argv, variable declarations etc.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文