C 我在为比萨饼配送系统编写代码。从命令提示符运行时,显示错误。我应该如何运行它?
我正在使用命令行参数和接口构建这个pizza程序。它应该返回参数中的成分C 我在为比萨饼配送系统编写代码。从命令提示符运行时,显示错误。我应该如何运行它?,c,command-line-interface,command-line-arguments,unistd.h,C,Command Line Interface,Command Line Arguments,Unistd.h,我正在使用命令行参数和接口构建这个pizza程序。它应该返回参数中的成分 #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(arg
#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;
}
#包括
#包括
#包括
int main(int argc,char*argv[])
{
char*delivery=“”;
int-thick=0;
整数计数=0;
char ch;
while(ch=getopt(argc,argv,“d:t”)!=EOF)
开关(ch)
{
案例“d”:
交付=optarg;
打破
案例“t”:
厚度=1;
打破
违约:
fprintf(标准,“无效选项:%s”,optarg);
返回1;
}
argc-=optind;
argv+=optind;
如果(厚)
放(“厚壳”);
如果(传递[0])
printf(“待交付%s”,交付);
配售(“配料:”);
对于(count=0;count您犯了五个错误(两个重要错误,三个不那么重要),其中一个重要错误是掩盖另一个错误
while(ch = getopt(argc, argv, "d:t") != EOF)
重要错误#1:of=
低于!=
,因此这会将比较结果分配给ch
,而不是预期的getopt
的返回值。不太重要的错误#1:getopt
返回−1当到达选项末尾时。EOF
不一定等于−一,
你应该写信的
while ((ch = getopt(argc, argv, "d:t")) != -1)
现在,如您所述调用时,在第一次迭代中,从getopt
返回的值将是'd'
,它不等于EOF
(也不等于−1) ,因此分配给ch
的值将是数字1(也称为Control-A,或U+0001标题的开始处
)。该数字不等于'd'
或't'
(C标准保证0<'a'<'b'<'C'<'d'<'z'
,因此,即使我们不假设ASCII,1也只能等于'a'
)因此,采用开关的默认
分支,我们这样做:
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个空格宽的硬制表符作为第二个级别;这是堆栈溢出接口中的一个长期缺陷,这种代码在粘贴到问题中时会被损坏。因此这不是您的错误t、 (不过,您应该只使用空格缩进。)代码中更严重的样式问题是,一些单语句循环周围有花括号,而有些没有。在C中,是否应该在单语句块周围放花括号是最古老的问题之一;我个人认为双方都错了,但没关系;你应该学习的重要一点是s、 选择一种或另一种样式,并在整个代码中始终坚持它。您已经犯了五个错误(两个重要错误,三个不那么重要),其中一个重要错误是掩盖另一个错误
while(ch = getopt(argc, argv, "d:t") != EOF)
重要错误#1:of=
低于!=
,因此这会将比较结果分配给ch
,而不是预期的getopt
的返回值。不太重要的错误#1:getopt
返回−1当到达选项末尾时。EOF
不一定等于−一,
你应该写信的
while ((ch = getopt(argc, argv, "d:t")) != -1)
现在,如您所述调用时,在第一次迭代中,从getopt
返回的值将是'd'
,它不等于EOF
(也不等于−1) ,因此分配给ch
的值将是数字1(也称为Control-A,或U+0001标题的开始处
)。该数字不等于'd'
或't'
(C标准保证0<'a'<'b'<'C'<'d'<'z'
,因此,即使我们不假设ASCII,1也只能等于'a'
)因此,采用开关的默认
分支,我们这样做:
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个空格宽的硬制表符作为第二个级别;这是堆栈溢出接口中的一个长期缺陷,这种代码在粘贴到问题中时会被损坏。因此这不是您的错误t、 (不过,应该只使用空格缩进。)代码中更严重的样式问题是,一些单语句循环周围有大括号,而一些