我正在为披萨外卖系统编写这段代码。当从命令提示符 运行 时,它显示错误。我应该如何运行呢?
I was writing this code for a pizza delivery system. When run from the command prompt it displayed an error. How should I run it?
我正在使用命令行参数和界面构建这个披萨程序。它应该 return 参数中的成分。
#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
这是 return 错误:
invalid option: now
我应该如何 运行 这个程序,为什么会显示这个错误?
你犯了五个错误(两个重要,三个次要),其中一个重要的错误是掩盖另一个。
while(ch = getopt(argc, argv, "d:t") != EOF)
重要错误 #1:=
的 operator precedence 比 !=
低 ,所以这分配了 与 ch
的比较结果,而不是您预期的 getopt
的 return 值。不太重要的错误 #1:getopt
returns −1 当它到达选项的末尾时。 EOF
不一定等于-1。
你应该写
while ((ch = getopt(argc, argv, "d:t")) != -1)
现在,当按照您的描述调用时,在第一次迭代中,从 getopt
编辑的值 return 将是 'd'
,它不等于 EOF
(也不是 −1),因此分配给 ch
的值将是数字 1(也称为 Control-A,或 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
编辑的值 return 当它到达参数的末尾时超出了范围char
.
fprintf(stderr, "Invalid option : %s", optarg);
printf("To be delivered %s", delivery);
这两个都需要在要打印的字符串末尾有一个 \n
。
在你的问题的原始形式中,你的代码缩进得很厉害,但我怀疑这是因为你使用了 4 spaces 作为一个缩进级别和 8-space-第二层的宽硬 TAB;这是 Stack Overflow 界面中的一个长期存在的错误,这种代码在粘贴到问题中时会被破坏。所以这不是你的错。 (不过,您应该只缩进 spaces。)您的代码中更严重的样式问题是您的一些单语句循环周围有花括号,而有些则没有。是否应该在 C 中的单语句块周围放置花括号是最古老的问题之一 holy wars;我个人认为双方都错了,但没关系;您应该学习的重要事情是,选择一种风格或另一种风格,并在您的代码中始终如一地坚持使用它。
我正在使用命令行参数和界面构建这个披萨程序。它应该 return 参数中的成分。
#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
这是 return 错误:
invalid option: now
我应该如何 运行 这个程序,为什么会显示这个错误?
你犯了五个错误(两个重要,三个次要),其中一个重要的错误是掩盖另一个。
while(ch = getopt(argc, argv, "d:t") != EOF)
重要错误 #1:=
的 operator precedence 比 !=
低 ,所以这分配了 与 ch
的比较结果,而不是您预期的 getopt
的 return 值。不太重要的错误 #1:getopt
returns −1 当它到达选项的末尾时。 EOF
不一定等于-1。
你应该写
while ((ch = getopt(argc, argv, "d:t")) != -1)
现在,当按照您的描述调用时,在第一次迭代中,从 getopt
编辑的值 return 将是 'd'
,它不等于 EOF
(也不是 −1),因此分配给 ch
的值将是数字 1(也称为 Control-A,或 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
编辑的值 return 当它到达参数的末尾时超出了范围char
.
fprintf(stderr, "Invalid option : %s", optarg);
printf("To be delivered %s", delivery);
这两个都需要在要打印的字符串末尾有一个 \n
。
在你的问题的原始形式中,你的代码缩进得很厉害,但我怀疑这是因为你使用了 4 spaces 作为一个缩进级别和 8-space-第二层的宽硬 TAB;这是 Stack Overflow 界面中的一个长期存在的错误,这种代码在粘贴到问题中时会被破坏。所以这不是你的错。 (不过,您应该只缩进 spaces。)您的代码中更严重的样式问题是您的一些单语句循环周围有花括号,而有些则没有。是否应该在 C 中的单语句块周围放置花括号是最古老的问题之一 holy wars;我个人认为双方都错了,但没关系;您应该学习的重要事情是,选择一种风格或另一种风格,并在您的代码中始终如一地坚持使用它。