Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Getopt不在C中获取和存储我的输入_C_Pointers_Printf_Getopt - Fatal编程技术网

Getopt不在C中获取和存储我的输入

Getopt不在C中获取和存储我的输入,c,pointers,printf,getopt,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 op

这是我在这个网站上的第一篇文章,所以请原谅任何格式错误。 我正在编写一个小程序,以便从文件中获取简单信息,如字数、排序等。不过,我只是从使用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);
    }
}
理想情况下,输出是

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

编辑


已经修好了。大卫·柯林斯的答案是正确的。非常感谢大家

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

平等测试 您应该使用
if(fflag==1)
而不是
if(fflag=1)

指针反引用 如果要检索由
子字符串
指向的字符的值,可以使用
*子字符串
而不是
&子字符串

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

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

if (fflag == 1) {
    printf("%s ", substring);
}
或者——更简单地说——只是

if (fflag) {
    puts(substring)
}

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

看起来像是在测试相等性时使用了
=
而不是
=
。我想你的意思可能是
if(fflag==1)
外部输入选项声明。如果在启用POSIX扩展的情况下编译,
应该声明它们。如果您抑制了POSIX,那么您也需要声明
getopt()
。请注意,如果'substring'指向
“abbc”
,则
printf(“%s”,substring)
的输出是
“abbc”
,但
put(substring)
的输出是
“abbc\n”
,这是显著不同的。总的来说,这是更好的-输出应终止与一个新的行;但这是不同的,总的来说,这很重要。你好,谢谢你的帮助。在我修复错误后,它现在正在打印。我还有一个问题。当我从%c改为%s,但仍然保留子字符串旁边的*时(因此我使用了printf(“%s”,*子字符串),它说的是分段错误。你知道为什么吗?@Jonathan Leffler:这一点很有道理,谢谢-OP可能由于代码中不明显的原因而省略了换行符。如果时间允许,我会尝试稍后更新答案(如果您愿意,也可以自己编辑。)@Kirishimas:使用
%s
说明符时,参数应为“指向字符类型数组的指针(指向字符串的指针)”(引用自
printf()
手册)。如果使用
*子字符串
,则传递的是
子字符串
地址处的值,而不是地址。
printf()
将尝试从无效地址读取-因此出现分段错误。
if (fflag) {
    puts(substring)
}