我正在使用命令行参数和界面构建这个披萨程序。它应该从参数中返回成分。
#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 中使用命令提示符运行此程序时:
program -d now -t
返回错误:
invalid option: now
我应该如何运行这个程序,为什么会出现这个错误?
最佳答案
你已经犯了五个错误(两个重要,三个不太重要),其中一个重要的错误是掩盖了另一个。
while(ch = getopt(argc, argv, "d:t") != EOF)
重要错误 #1:operator precedence的 =
低于 !=
, 所以这会将比较结果分配给ch
, 而不是 getopt
的返回值如你所料。不太重要的错误 #1:getopt
当它到达选项的末尾时返回 -1。 EOF
不一定等于-1。
你应该写
while ((ch = getopt(argc, argv, "d:t")) != -1)
现在,当按照您的描述调用时,在第一次迭代中从 getopt
返回的值将是 'd'
,不等于 EOF
(也不是-1),所以赋值给ch
将是数字 1(也称为 Control-A,或 U+0001 START OF HEADING
)。此数字不等于 'd'
或 't'
(C 标准保证 0 < 'a' < 'b' < 'c' < 'd' < ... < 'z'
,所以即使我们不假设 ASCII,1 也只能等于 'a'
)所以 default
switch
的分行被采取,我们这样做:
fprintf(stderr, "Invalid option : %s", optarg);
return 1;
这是重要的错误 2:你应该打印 ch
,不是 optarg
, 当你得到一个无效的选项时。 ch
是选项; optarg
是选项的参数,如果有的话。如果你打印了 ch
你会意识到 ch
中的值不是您期望的那样。
其他不太重要的错误是
char ch;
这应该是 int ch;
就像在 getchar
循环,从getopt
返回的值当它到达参数末尾时超出了 char
的范围.
fprintf(stderr, "Invalid option : %s", optarg);
printf("To be delivered %s", delivery);
这两个都需要 \n
在要打印的字符串的末尾。
在你问题的原始形式中,你的代码缩进得很厉害,但我怀疑这是因为你使用了 4 个空格作为单级缩进,而 8 个空格宽的硬制表符用于第二级;这是 Stack Overflow 界面中的一个长期存在的错误,这种代码在粘贴到问题中时会被破坏。所以这不是你的错。 (尽管如此,您应该只缩进空格。)您的代码更严重的样式问题是您的一些单语句循环周围有花括号,而有些则没有。是否应该在 C 中的单语句 block 周围放置花括号是最古老的问题之一 holy wars ;我个人认为双方都错了,但没关系;您应该学习的重要事情是,选择一种风格或另一种风格,并在您的代码中始终如一地坚持使用它。
关于c - 我正在为披萨外卖系统编写这段代码。从命令提示符运行时,它显示错误。我应该如何运行它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37971094/