我正在为披萨外卖系统编写这段代码。当从命令提示符 运行 时,它显示错误。我应该如何运行呢?

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') 所以 switchdefault 分支被采用,我们这样做:

fprintf(stderr, "Invalid option : %s", optarg);
return 1;

这是一个重要的错误 2:当你得到一个无效的选项时,你应该打印 ch,而不是 optargch 是选项; 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;我个人认为双方都错了,但没关系;您应该学习的重要事情是,选择一种风格或另一种风格,并在您的代码中始终如一地坚持使用它