C 中的 getopt() 不读取选项参数

问题描述 投票:0回答:1

我正在输入一个程序,它需要三个命令行选项:s、f 和 c
因为我被告知使用 getopt() 作为获取它们的函数,所以我调查了它。

三个选项的作用如下:
s - 这只是一个“无日志”选项,我需要做的就是检查它是否存在
f - 这是一个文件路径选项,后面跟着它的参数(我决定最好把它当作一个字符数组,然后用它来使用 fopen)
c - 这是另一个 char 数组,它在自身之后有一个参数

经过 2 小时尝试通过该功能正确获取这些选项但无法成功,我正在与您联系。

getopt() 的文档出奇地少,我找不到一个很好的例子来逐行解释代码,但是尽管如此,这是我在阅读 geeksforgeeks 页面和 GNU 的几个页面后想到的有关它的文档:

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

int main(int argc, char **argv)
{
    int opt;
    char *cli_input_s = NULL;
    char *cli_input_f = NULL;
    char *cli_input_c = NULL;

    while ((opt = getopt(argc, argv, "fc:s")) != -1)
    {
        switch (opt)
        {
            case 's':
                printf("Program is executing without logs.\n");
                break;
            case 'f':
                strcpy(cli_input_f, argv[optind]);
                break;
            case 'c':
                strcpy(cli_input_c, argv[optind]);
                break;
            case '?':
                printf("The program has encountered an unknown argument, aborting.");
                break;
            default:
                printf("I don't know what exactly is going on but...");
                break;
        }
    }

    printf("%d \n", argc);
    printf("%s \n", cli_input_s);
    printf("%s \n", cli_input_f);
    printf("%s \n", cli_input_c);
}

我正在使用 argv[optind] 而不是 optarg,因为它不会将正确的内容记录到参数中。到目前为止,我一直在尝试运行以下 CLI 输入:
文件名 -s -f abc -c abc

我得到的结果是“程序正在执行而没有日志。”就是这样。
在某些时候,我实际上设法让所有的 printf 都在最后......打印。
但现在这是唯一打印出来的东西,我完全没有想法。
编译也需要很长的时间(几秒钟)。 我正在使用 CLion IDE 及其捆绑的 MinGW 编译器。

我到底做错了什么,为什么我不能正确获取 CLI 参数?

c getopt
1个回答
0
投票

选项字符串

"fc:s"
表示只有
-c
可以有参数。对于可以接受参数的
each
选项,您需要参数字符 :

所以如果您希望

"f:c:s"
选项也有一个参数,您的字符串应该是
-f


那个选项参数字符串是你的问题中最少的。一个更糟糕的问题是你有 undefined behavior 由于你使用空指针...

举个例子

strcpy(cli_input_f, argv[optind]);

指针

cli_input_f
是一个空指针。它没有指向任何地方。但是您将它用作字符串的目的地。那是不可能的。

您必须有一个指向字符串的指针,该字符串的长度足以容纳源字符串,包括末尾的空终止符。

我建议您只需将变量从指针更改为足够大小的数组:

char cli_input_f[256] = { 0 };  // Initialize all elements to the string null-terminator
© www.soinside.com 2019 - 2024. All rights reserved.