我刚刚处理了这个问题,看来这个问题从未得到完全回答。
您必须确保opterr = 0
在调用之前设置了外部 libc 变量getopt
;如果您不重置它并且getopt
之前在系统中使用它的任何地方的另一个应用程序中出现错误,则该参数将失败。我还要重申现有的观点,因为在那之后你没有中断声明,case 'X':
这是一个问题的明确迹象,因为它会失败。
getopt
一次只处理一个参数,因此从案例X
到案例f
是一件坏事。在 a 的每个 case 语句中,您应该始终有一个中断,switch
除非您绝对确定它应该通过(这在我的经验中非常罕见)。作为另一种一般的良好做法,您应该始终将代码块包含在 { } 中(指您的条件),除非它是一个return
语句或break
导致程序流退出当前或父块范围或进入的东西通过函数或方法调用的新作用域。
我认为您的选项字符串 Xf:eE:dD 很好。这表明:
1) 以下将只是始终具有空参数的选项标志:XedD
2) 以下选项需要一个参数:fE
如果这是您正在寻找的功能,那么给定的选项字符串就可以了。如果您使用的是 GNU libc,则根据上述其他答案,您可以在选项字符串中的选项之后使用 :: 来指示该选项可能有一个参数,但不是必须的。
所以在你的文件顶部确保你至少有:
extern int opterr;
然后在您getopt
第一次在代码中调用之前,将其设置opterr
为 0。
例如
opterr = 0;
while ((opt = getopt(argc, argv, "Xf:eE:dD")) != EOF) {
switch (opt) {
case 'X':
case 'f':
if (optarg == NULL)
fput("no point of living", fp); << for debugging
这至少应该可以部分解决您的问题。这是一个示例的链接:
http://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html
干杯,
乔恩