0

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

#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 现在 -t

它返回一个错误:

无效选项:现在

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

4

1 回答 1

4

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

while(ch = getopt(argc, argv, "d:t") != EOF)

重要错误 #1: 的运算符优先级低于,因此这会将比较结果分配给,而不是您预期的返回值 。不太重要的错误 #1:当它到达选项的末尾时返回 -1。 不一定等于-1。=!=chgetoptgetoptEOF

你应该写

while ((ch = getopt(argc, argv, "d:t")) != -1)

现在,当按照您的描述调用时,在第一次迭代中,返回的值getopt将是'd',不等于EOF(也不等于 -1),因此分配给的值ch将是数字 1(也称为 Control-A,或U+0001 START OF HEADING)。这个数字不等于'd'or 't'(C 标准保证0 < 'a' < 'b' < 'c' < 'd' < ... < 'z',所以即使我们不假设 ASCII,1 也只能等于'a')所以采用 的default分支switch,我们这样做:

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

这里有一个重要的错误 2:当你得到一个无效的选项时, 你应该 print ch,而不是。是选项;是选项的参数,如果有的话。如果你打印了,你会意识到 in 的值不是你期望的。optargchoptargchch

其他不太重要的错误是

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 中的单语句块周围放置花括号是最古老的圣战之一;我个人认为双方都错了,但没关系;您应该学习的重要一点是,选择一种风格或另一种风格,然后在您的代码中始终如一地坚持下去

于 2016-06-22T14:46:26.117 回答