我在学校并获得编写C程序的任务,该程序从用户获取输入然后扫描文件并返回该单词在文件中出现的次数。我觉得我完成了90%,但由于某种原因,我无法得到while循环。当我运行程序时,它会在while循环中崩溃。任何帮助或指导将不胜感激。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
int main() {
char input[50], file[50], word[50];
int wordcount;
printf("Enter a string to search for\n");
scanf("%s", input);
printf("Enter a file location to open\n");
scanf("%s", file);
FILE * fp;
fp = fopen("%s", "r", file);
while (fscanf(fp, "%s", word) != EOF) {
if (strcmp(word, input)) {
printf("found the word %s\n", input);
wordcount++;
}
}
printf("The world %s shows up %d times\n", input, wordcount);
system("pause");
}
答案 0 :(得分:0)
您正在尝试打开名为“%s”的文件,我很确定该文件不存在。如果您已经检查了fopen
的回报,那么您可以自己弄明白。
答案 1 :(得分:0)
你有两个问题:
fp = fopen("%s", "r", file);
不正确,fopen
只需要两个参数,而不是三个。正确的版本
是
fp = fopen(file, "r");
请注意,C语言中没有允许您构造的功能
来自"%s", variable
1 等变量的字符串。这仅适用于功能
像printf
那样读取格式并根据修复集解释格式
你可以看到here的规则。
第二个问题是:
if (strcmp(word, input))
strcmp
用于比较两个字符串,但是当字符串返回0时
是相等的,否则不为零。所以正确的检查应该是
if(strcmp(word, input) == 0)
{
printf("found the word %s\n", input);
wordcount++;
}
最后一件事:当您阅读带有scanf
的字符串时,您应该限制金额
要读取的字符,否则您将溢出缓冲区和此产量
未定义的行为可能导致段错误。
input
是char[50]
,因此它最多可容纳49个字符,效果更好
scanf
电话会是
scanf("%49s", input);
这样你就确保不要写超出数组的界限。
<强> Fotenotes 强>
1 字符串"%s"
在C语言中没有任何实际意义,就像任何语言一样
其他字符串它是一个以字符串结尾的字符序列
'\0'
- 终止字符。此字符串的内存布局为
+---+---+----+
| % | s | \0 |
+---+---+----+
printf
系列函数会提供一定数量的字符序列
(以%
开头的那些)具有明确的含义。它们用于确定应该变量的类型
在打印时使用以及其他格式选项。有关详细信息,请参阅the printf
documentation。你必须
但请记住,这种类型的构造仅适用于printf
因为
printf
的设计是以这种方式工作的。
如果需要使用其他变量的值构造字符串,则需要
拥有足够空间的数组并使用sprintf
之类的函数。对于
例如:
const char *base = "records";
int series = 8;
char fn[100];
sprintf(fn, "%s%d.dat", base, series);
// now fn has the string "records8.dat"
FILE *fp = fopen(fn, "r");
...
但在你的情况下,这是不必要的,因为整个文件名已经存在
存储在变量file
中,因此构建基于file
的新字符串不是
需要的。