为什么libargtable2使用可选参数表现奇怪?

时间:2012-07-26 14:07:07

标签: c shared-libraries command-line-arguments

如果有人使用 argtable 作为C-Code的命令行参数解析器,那么这就是我的问题:

我的意图

我使用最新版本的argtable2库在Linux平台上用C编程。

我要存档的内容是采用多个输入文件的程序和可选选项(让我们称之为-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会话来说明我的意思。它使用产生问题的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的作者似乎都没有时间真正研究我的问题。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

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

要测试此功能,请尝试

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

在您的测试用例中,然后

./argbug -o other.txt

您会看到它出错。

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

查看代码的提示:has_arg是枚举0 =无参数1 =必需arguemnt 2 =可选参数

简答

如果标志和参数之间有空格,

libargtable将不处理可选参数。删除空格,它应该工作。

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