把操作数放在getopt()中

时间:2013-07-17 02:53:28

标签: c linux getopt

使用C中的getopt()函数,可以这样做:

program -a arg_for_a -b arg_for_b -c operand1 operand2

它没有问题。

但是,如何使它以这种方式工作?:

program operand1 operand2 -a arg_for_a -b arg_for_b -c

在这种情况下,每个参数(包括-a-b等都被视为操作数。

我试图像gccssh那样做:

gcc code.c -o executable
ssh user@host -i file.pem

也就是说,无论选项和操作数在什么位置,它们都被正确识别。

如何在任何地方正确识别选项,并且不遵循选项的每个单词都被识别为操作数?

1 个答案:

答案 0 :(得分:3)

如果您使用GNU C库的getopt实现,那么它将像所有GNU实用程序一样工作,因为几乎所有它都使用它。特别是(引自man 3 getopt):

  

默认情况下,getopt()会在扫描时置换argv的内容,以便最终所有非选择都在最后。

这与gcc不完全相同。 gcc关注可选和位置参数的相对顺序。 (例如,-l在命令行中的位置会有所不同。)为此,您必须告诉GNU getopt 而不是置换参数。然后,每次getopt报告它已完成时,optind将具有下一个位置参数的索引(如果有的话)。然后,您可以使用该参数,增加optind,然后继续使用getopt,这将在下一个参数处继续。