Getopt 没有获取我的输入并将其存储在 C 中

Getopt not grabbing and storing my input in C

这是我第一次 post 访问此站点,因此请原谅任何格式错误。 我正在编写一个小程序以从文件中获取简单信息,例如单词数量、排序等。但是我只是通过使用 getopt 开始,因为我想使用命令行来解析我的命令。这是我到目前为止所拥有的。

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

int value = 0;

int main(int argc, char **argv) {
    extern char *optarg;
    extern int optind;
    int c, err = 0;
    int cflag = 0, sflag = 0, fflag = 0;
    char *substring;

    // usage from instructions in case of error
    static char usage[] = "usage: mywords [-cs] [-f substring] filename";  

    // only f flag requires additional input
    while ((c = getopt(argc, argv, "csf:")) != -1)
        switch (c) {
            case 'c':
                cflag = 1;
                break;

            case 's':
                sflag = 1;
                break;

            case 'f':
                fflag = 1;
                printf("Before assigning to substring\n");
                substring = optarg;
                printf("After\n");
                break;

            case '?':
                err = 1;
                break;
        }

    if (fflag = 1) {
        printf("%c ", &substring);
    }
}

在 运行 我的 makefile(运行 成功且没有错误)之后,我将在命令行中输入类似这样的内容:

    mywords -f test

理想情况下输出为

    test

我在 fflag 中的 printf 语句是简单的测试打印,以查看我是否到达那里。提前感谢您的帮助。

编辑

已修复。大卫柯林斯的答案是正确的。非常感谢大家

我注意到您的代码中存在三个问题。 (可能还有其他小问题,但解决以下问题应该会让你振作起来,我认为 运行。)

相等性测试

您应该使用 if (fflag == 1) 而不是 if (fflag = 1)

指针取消引用

如果要检索 substring 指向的字符的值,可以使用 *substring 而不是 &substring

但您可能不想这样做。见下文。

printf() 格式说明符

打印字符串/字符数组时,使用%s 说明符而不是%c。 (%c 用于单个字符)。所以你应该

if (fflag == 1) {
    printf("%s ", substring);
}

或者 - 更简单 - 只是

if (fflag) {
    puts(substring)
}

因为任何非零值在 C 中的计算结果为真(并且您在程序开始时将 fflag 初始化为零)。