gpt4 book ai didi

c - 为什么库表在使用可选参数时表现异常?

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

如果有人将 argtable 用作 C 代码的命令行参数解析器,我的问题是:

我的意图

我正在使用最新版本的 argtable2 库在 Linux 平台上使用 C 语言进行编程。

我想要存档的是一个接受多个输入文件 和一个 optional (我们称之为-o)的程序。如果 -o 未提供作为 shell 调用中的选项,则程序不会写入任何输出。如果 -o 由自身提供,则程序的输出将写入默认文件,称为“output.txt”。如果该选项与文件名一起提供,例如-o other.txt输出应写入给定的文件名 - 在本例中为“other.txt”。

问题

在我所有的尝试中,argtable 行为不当。它解释可选值连同-o作为输入文件给出。所以 ./program -o other.txt inputfile1.dat inputfile2.dat inputfile3.dat 将被解释为有四个输入文件 - 三个“inputfile*.dat”和“other.txt”应该是输出文件。

重现问题

这是一个 shell session 来说明我的意思。它使用 minimal example这会产生问题。我不确定是我做错了什么还是 libargtable2 中的错误:

confus@confusion:~$ gcc -o argbug argbug.c -largtable2
confus@confusion:~$ ./argbug
Error: missing option INPUT-FILES

Usage:
./argbug [-o [<file>]] INPUT-FILES
-o [<file>] File to write output to. Default is 'output.txt'.
Omit whole option to discard all output
INPUT-FILES Input files
confus@confusion:~$ ./argbug inputfile1.dat inputfile2.dat inputfile3.dat -o other.txt
inputfile[0] = inputfile1.dat # this is okay output
inputfile[1] = inputfile2.dat # as is this line
inputfile[2] = inputfile3.dat # also okay output
inputfile[3] = other.txt # "other.txt" is falsely recognized as an input file
outputfile = output.txt # should be "other.txt" instead of the default "output.txt"

无论是我还是 Steward,argtable 的作者似乎都没有时间真正研究我的问题。有什么想法吗?

最佳答案

我运行了您的测试并发现了同样的问题。查看源代码,似乎 libargtable 正在正确处理它,但它归结为 getopt 行为。

如果您查看 getopt.c 中第 647 行的开头,您会发现 getopt 首先检查是否附加了一个参数,没有选项和参数之间的任何空格(例如 -oother. TXT)。如果是这种情况,它会处理它。这是唯一会注意到可选参数的情况。

要测试这个,试试

void *argtable[] = { argOutput, end };

在你的测试用例中,然后

./argbug -o other.txt

你会看到它给出了一个错误。

但是,它还有一段额外的代码,用于检查是否有必需的选项。如果是这样,即使标志和参数之间有空格,它也会执行额外的选项搜索来满足这一点。

查看代码的提示:has_arg 是一个枚举,其中 0=无参数 1=必需参数 2=可选参数

简答

如果标志和参数之间有空格,libargtable 将不会处理可选参数。删除空格,它应该可以工作。

我可能认为这是一个错误,但也许有些人喜欢这种行为。

关于c - 为什么库表在使用可选参数时表现异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11671090/

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