Getopt不在C中获取和存储我的输入
这是我在这个网站上的第一篇文章,所以请原谅任何格式错误。 我正在编写一个小程序,以便从文件中获取简单信息,如字数、排序等。不过,我只是从使用getopt开始,因为我想使用命令行解析我的命令。这就是我目前所拥有的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
#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)
}