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

标签 c command-line-interface command-line-arguments unistd.h

我正在使用命令行参数和界面构建这个披萨程序。它应该从参数中返回成分。

#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/

相关文章:

java - 如何处理像 "java.exe program < s1.in"这样的命令行输入

c# - 如何判断在使用 System.CommandLine 时是否指定了一个选项?

c# - 如何通过 C# 传递多个命令行参数

c - 选择排序递归函数的段错误

python - 设计带有列表的可扩展命令行界面

python - 如何从 python 脚本启动 EDITOR(例如 vim)?

android - sdkmanager 警告 : Failed to read or create install properties file

c++ - strchr, memchr 定位字符失败

c - 在 C 中使用 bsearch 的段错误

Cygwin:Libcurl 不工作