我正在使用命令行参数和接口构建这个比萨饼程序。它应该从论点中返回成分。
#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
int main(int argc, char *argv[])
{
char *delivery = "";
int thick = 0;
int count = 0;
char ch;
while(ch = getopt(argc, argv, "d:t") != EOF)
switch(ch)
{
case 'd' :
delivery = optarg;
break;
case 't' :
thick = 1;
break;
default:
fprintf(stderr, "Invalid option : %s", optarg);
return 1;
}
argc -= optind;
argv += optind;
if(thick)
puts("thick crust");
if(delivery[0])
printf("To be delivered %s", delivery);
puts("ingredients :");
for(count = 0; count<argc; count++)
{
puts(argv[count]);
}
return 0;
}在windows中使用命令提示符运行此程序时,如下所示:
程序-d now -t
它返回了一个错误:
无效选项:现在
我应该如何运行这个程序,为什么会显示这个错误?
发布于 2016-06-22 14:46:26
你犯了五个错误(两个重要,三个不重要),其中一个重要的错误掩盖了另一个。
while(ch = getopt(argc, argv, "d:t") != EOF)重要的错误1:运算符优先 of =低于!=,因此这会将比较的结果分配给ch,而不是您所期望的getopt的返回值。不太重要的错误#1:getopt在到达选项末尾时返回−1。EOF不一定等于−1。
你应该写
while ((ch = getopt(argc, argv, "d:t")) != -1)现在,如您所述,在第一次迭代中,从getopt返回的值将是'd',它不等于EOF (也不等于−1),因此分配给ch的值将是数字1(也称为Control,或U+0001 START OF HEADING)。这个数字不等于'd'或't' (C标准保证0 < 'a' < 'b' < 'c' < 'd' < ... < 'z',所以即使我们不假定ASCII,1只能等于'a'),所以使用switch的default分支,我们这样做:
fprintf(stderr, "Invalid option : %s", optarg);
return 1;这里有一个重要的错误2:当您得到一个无效的选项时,应该打印ch,而不是optarg。ch是选项;optarg是选项的参数(如果有的话)。如果您已经打印了ch,您就会意识到,ch中的值并不是您所期望的那样。
其他不太重要的错误是
char ch;这应该是int ch;,就像在getchar循环中一样,当getopt到达参数末尾时从getopt返回的值超出了char的范围。
fprintf(stderr, "Invalid option : %s", optarg);
printf("To be delivered %s", delivery);这两种方法都需要打印字符串末尾的\n。
在最初的问题形式中,您的代码缩进得很糟糕,但我怀疑这是因为您使用了4个空格作为一个缩进级别,使用了一个8空间的硬TAB作为第二个级别;这是堆栈溢出接口中一个长期存在的错误,当粘贴到一个问题时,这种代码会被损坏。所以不是你的错。(不过,您应该只缩进空格。)代码中更严重的风格问题是,有些语句循环中有花括号,而有些则没有。在C中,是否应该在单个语句块周围放置花括号是最古老的圣战之一;我个人认为这两个方面都错了,但没关系;重要的是要学习的是,选择一种样式,并在整个代码中始终坚持它。
https://stackoverflow.com/questions/37971094
复制相似问题