首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我在为披萨配送系统写这段代码。从命令提示符运行时,它会显示一个错误。我该怎么操作呢?

我在为披萨配送系统写这段代码。从命令提示符运行时,它会显示一个错误。我该怎么操作呢?
EN

Stack Overflow用户
提问于 2016-06-22 14:30:20
回答 1查看 88关注 0票数 0

我正在使用命令行参数和接口构建这个比萨饼程序。它应该从论点中返回成分。

代码语言:javascript
复制
#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

它返回了一个错误:

无效选项:现在

我应该如何运行这个程序,为什么会显示这个错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-22 14:46:26

你犯了五个错误(两个重要,三个不重要),其中一个重要的错误掩盖了另一个。

代码语言:javascript
复制
while(ch = getopt(argc, argv, "d:t") != EOF)

重要的错误1:运算符优先 of =低于!=,因此这会将比较的结果分配给ch,而不是您所期望的getopt的返回值。不太重要的错误#1:getopt在到达选项末尾时返回−1。EOF不一定等于−1。

你应该写

代码语言:javascript
复制
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'),所以使用switchdefault分支,我们这样做:

代码语言:javascript
复制
fprintf(stderr, "Invalid option : %s", optarg);
return 1;

这里有一个重要的错误2:当您得到一个无效的选项时,应该打印ch,而不是optargch是选项;optarg是选项的参数(如果有的话)。如果您已经打印了ch,您就会意识到,ch中的值并不是您所期望的那样。

其他不太重要的错误是

代码语言:javascript
复制
char ch;

这应该是int ch;,就像在getchar循环中一样,当getopt到达参数末尾时从getopt返回的值超出了char的范围。

代码语言:javascript
复制
fprintf(stderr, "Invalid option : %s", optarg);
printf("To be delivered %s", delivery);

这两种方法都需要打印字符串末尾的\n

在最初的问题形式中,您的代码缩进得很糟糕,但我怀疑这是因为您使用了4个空格作为一个缩进级别,使用了一个8空间的硬TAB作为第二个级别;这是堆栈溢出接口中一个长期存在的错误,当粘贴到一个问题时,这种代码会被损坏。所以不是你的错。(不过,您应该只缩进空格。)代码中更严重的风格问题是,有些语句循环中有花括号,而有些则没有。在C中,是否应该在单个语句块周围放置花括号是最古老的圣战之一;我个人认为这两个方面都错了,但没关系;重要的是要学习的是,选择一种样式,并在整个代码中始终坚持它。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37971094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档