gpt4 book ai didi

c - 带有可选参数的 getopt_long() 选项

转载 作者:行者123 更新时间:2023-11-30 16:54:14 24 4
gpt4 key购买 nike

我正在尝试使用 getopt_long() 创建一个带有可选参数的选项。

这是我的代码:

static struct option long_options[] = {
{"help", no_argument, NULL, 'h'},
{"debug", no_argument, NULL, 'd'},
{"config", optional_argument, NULL, 'c'},
{NULL, 0, NULL, 0}
};

while ((ch = getopt_long(argc, argv, "hdc::", long_options, NULL)) != -1) {
// check to see if a single character or long option came through
switch (ch) {
case 'h':
opt.help = true;
break;
case 'd':
opt.debug = true;
break;
case 'c':
printf("C-Option: %s\n", optarg);
if (optarg != NULL) {
opt.configFile = optarg;
}
break;
}
}

我试图将 -c 的参数设置为可选,以便您可以使用以下选项运行程序:

-c test.cfg --> optarg = "test.cfg"

-c --> optarg = null

如果我设置 c:: ,则 optarg 始终为 null

如果我设置c:,则会收到错误:选项需要一个参数 -- 'c'

我做错了什么?我还可以设置其他选项吗?

最佳答案

来自man pages :

If the option has an optional argument, it must be written directly after the option character if present.

您的代码按预期工作:

./a.out -c some_argument --> "C-Option: (null)"
./a.out -csome_argument --> "C-Option: some_argument"
./a.out -c=some_argument --> "C-Option: =some_argument"

您可以考虑在可选参数名称前添加 '=' ,如上例所示。这是another question讨论这个问题。

更新

我在other question的链接中看到了这个问题的一个很好的解决方案。上面提到过。这个想法是检查,在带有参数的选项之后,看看 argv[] 中的下一个字符串是否存在。是一个选项。如果不是,则认为这是一个争论。然后处理该参数,并且 optind相应地提前。以下是如何将此想法应用于您的问题:

case 'c':
if (optarg == NULL && argv[optind] != NULL
&& argv[optind][0] != '-') { // not an option
printf("C-Option: %s\n", argv[optind]);
opt.configFile = argv[optind];
++optind;
} else { // handle case of argument immediately after option
printf("C-Option: %s\n", optarg);
if (optarg != NULL) {
opt.configFile = optind;
}
break;

此代码将产生以下输出:

./a.out -csome_argument  --> "C-Option: some_argument"
./a.out -c some_argument --> "C-Option: some_argument"

关于c - 带有可选参数的 getopt_long() 选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40594208/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com