Getopt没有抓住并将我的输入存储在C中

时间:2018-06-09 08:35:44

标签: c pointers printf getopt

这是我在本网站上的第一篇文章,请原谅任何格式错误。 我正在编写一个小程序来从一个文件中获取简单的信息,如大量的单词,排序等等。但是我开始只是使用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语句是简单的测试打印,看看我是否到达那里。感谢您的帮助。

修改

它被修复了。大卫柯林斯有正确的答案。非常感谢大家

1 个答案:

答案 0 :(得分:4)

我注意到你的代码中有三个问题。 (可能还有其他一些小问题,但是我认为解决以下问题应该可以帮助您正常运行。)

测试平等

您应该使用if (fflag == 1)代替if (fflag = 1)

指针解除引用

如果要检索substring指向的字符的值,可以使用*substring代替&substring

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

printf()格式说明符

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

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

或者 - 更简单 - 只是

if (fflag) {
    puts(substring)
}

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