c - getopt 无法识别 c 中的多个命令行标志

标签 c command-line-arguments getopt

我正在学习 C,我正在尝试使用 getopt() 来获取命令行标志。我的问题是它只会将第一个命令标志识别为标志,并将其他任何命令视为常规命令行参数。这是我的代码:

#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char *argv[]) {
    char *delivery = "";
    int thick = 0;
    int count = 0;
    char ch;

    while ((ch = getopt(argc, argv, "d:t")) != -1) {
        switch (ch) {
            case 'd':
                delivery = optarg;
                break;
            case 't':
                thick = 1;
                break;
            default:
                fprintf(stderr, "Unknown option: '%s'\n", optarg);
                return 1;
        }
        argc -= optind;
        argv += optind;
    }
    if(thick) {
        puts("Thick crust.");
    }
    if (delivery[0]) {
        printf("To be delivered %s.\n", delivery);
    }
        puts("Ingredients:");
        for(count = 0; count < argc; count++) {
            if (!strstr(argv[count], "./")) {
                puts(argv[count]);
            }
        }
    return 0;
}

当我做一个标志或不做任何标志时,它完全可以正常工作:

$ ./order_pizza Anchovies
Ingredients:
Anchovies

$ ./order_pizza Anchovies Pineapple
Ingredients:
Anchovies
Pineapple

$ ./order_pizza -d now Anchovies Pineapple
To be delivered now.
Ingredients:
Anchovies
Pineapple

$ ./order_pizza -t Anchovies Pineapple
Thick crust.
Ingredients:
Anchovies
Pineapple

但是,当我做不止一个标志时:

$ ./order_pizza -d now -t Anchovies Pineapple
To be delivered now.
Ingredients:
-t
Anchovies
Pineapple

$ ./order_pizza -t -d now Anchovies Pineapple
Thick crust.
Ingredients:
-d
now
Anchovies
Pineapple

我似乎无法弄清楚我做错了什么,因为从我的搜索来看,似乎没有人遇到同样的问题。我在 Windows 7 上使用 cygwin 并使用以下行进行编译:

$ gcc order_pizza.c -o order_pizza

有人有什么想法吗?

最佳答案

不要在调用 getoptwhile 循环中修改 argcargv。它使用这些变量来发挥它的魔力,因此更改它们会使它变得困惑。

所以不是这个:

while ((ch = getopt(argc, argv, "d:t")) != -1) {
    switch (ch) {
    ...
    }
    argc -= optind;
    argv += optind;
}

这样做:

while ((ch = getopt(argc, argv, "d:t")) != -1) {
    switch (ch) {
    ...
    }
}
argc -= optind;
argv += optind;

关于c - getopt 无法识别 c 中的多个命令行标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31386739/

相关文章:

c++ - Visual Studio C 或 C++ 中的最大值

c++ - C++ 的任何命令行解析库是否允许带有 N 个参数的选项

c - 如何从 optarg 获取值

c - 可以拆分/级联 getopt_long 吗?

C++ 命令行参数识别

c - 使用 getopt_long() 的段错误

c - Bash for Windows 10 gcc 不会编译粘贴到根目录中的 c 文件

c - 直接访问进程内存

c++ - Eclipse C/C++ 显示错误但编译?

string - 如何将带有多个参数的单个字符串传递给 std::process::Command?