gpt4 book ai didi

c - Getopt 为特定的选项顺序返回 -1

转载 作者:太空宇宙 更新时间:2023-11-04 11:18:25 25 4
gpt4 key购买 nike

基本上,当我在其他选项之前有一个非选项时,getopt 会返回 -1。

    n = atoi(argv[1]);

while ((opt = getopt(argc, argv, "hi:o:")) != -1) {
switch (opt) {
case 'i':
ifile = optarg;
break;
case 'o':
ofile = optarg;
break;
case 'h':
printf("...");
break;
default:
printf("Invalid Option\n");
exit(0);
}
}

例子:

./a.out 22 -i infile -o outfile

这使得 getopt 返回 -1 并且 switch 语句永远不会被执行。

./a.out -i infile -o outfile

但是这可行,但我真的希望第一个选项只是一个数字,而不必包含另一个选项。

我认为 getopt 应该可以处理这种情况,但我可能错了。感谢您的帮助!

最佳答案

通用解决方案

解决所提出问题的最简单方法是:

n = atoi(argv[1]);

argv[1] = argv[0];
++argv;
--argc;

while ((opt = getopt(argc, argv, "hi:o:")) != -1)
{
...as before...
}

这有效地使用了第一个选项,然后将内容重新调整为正统格式。这适用于远程符合标准(事实上和法律上)的任何版本的 getopt()。请注意,如果您不重新分配 argv[1] = argv[0];getopt() 将使用原始 argv[1] 中的值(本例中的数字)作为“程序名称”。

使用 GNU getopt()

使用 GNU getopt() , 有两种方法来处理这个问题。一种使用“按顺序返回”功能,以便将非选项(“文件名”)参数视为以选项字符代码 1(ASCII SOH 控制字符;又名 Control-A).另一个使用默认模式,其中 getopt() 在处理选项时排列选项。请注意,这在 Mac OS X 和其他平台上默认不可用。

这段代码几乎完成了这两项工作;您只需使用 "-hi:o:" 在“排列”模式(如图所示)和“按顺序返回”模式之间更改选项字符串。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <getopt.h>

int main(int argc, char **argv)
{
int n;
int opt;
char *ifile = 0;
char *ofile = 0;

n = atoi(argv[1]);

while ((opt = getopt(argc, argv, "hi:o:")) != -1)
{
printf("Option: %c\n", opt);
switch (opt)
{
case 'i':
ifile = optarg;
break;
case 'o':
ofile = optarg;
break;
case 'h':
printf("...");
break;
case 1:
n = atoi(optarg);
break;
default:
printf("Invalid Option %d\n", opt);
exit(1);
}
}

printf("argc = %d; optind = %d\n", argc, optind);
for (int i = optind; i < argc; i++)
printf("argv[%d] = %s\n", i, argv[i]);

if (ifile != 0)
printf("i-file: %s\n", ifile);
if (ofile != 0)
printf("o-file: %s\n", ofile);
printf("%d\n", n);

return 0;
}

使用“permute”运行的示例:

$ go9 9 -i in -o out
Option: i
Option: o
argc = 6; optind = 5
argv[5] = 9
i-file: in
o-file: out
9
$

使用“按顺序返回”运行的示例:

$ go9 9 -i in -o out
Option:
Option: i
Option: o
argc = 6; optind = 6
i-file: in
o-file: out
9
$

如果你想让它工作,请确保你没有设置环境变量 POSIXLY_CORRECT。您可以在选项字符串前加上 + 以强制执行类似 POSIX 的行为。

关于c - Getopt 为特定的选项顺序返回 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19759044/

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