C程序统计文件单词出现次数时while循环崩溃,求技术帮助
帮你修复C程序中的while循环崩溃问题及其他错误
我看到你的程序已经完成了大部分,但确实有几个关键问题导致了崩溃和结果错误,咱们一步步来解决:
问题1:fopen调用方式错误
你现在写的fp = fopen("%s", "r", file);是错的,fopen不支持格式化参数输入,它的第一个参数直接是文件名字符串,第二个是打开模式。这么写会让程序尝试打开名为%s的文件,显然找不到,导致fp变成NULL,后续用fscanf操作空指针就会直接崩溃。
正确写法应该是:
fp = fopen(file, "r");
问题2:未初始化wordcount变量
你声明了int wordcount;但没有给初始值,它会被分配一个随机的垃圾数值,最后输出的统计结果肯定不对。要初始化为0:
int wordcount = 0;
问题3:strcmp的判断逻辑搞反了
strcmp(a, b)的返回值是0时,表示两个字符串完全相等。你现在的if (strcmp(word, input))是当两个字符串不相等时执行计数,这完全和需求相反。应该改成:
if (strcmp(word, input) == 0)
问题4:缺少文件打开失败的检查
如果用户输入的文件路径不存在或者没有权限,fopen会返回NULL,这时候直接进入while循环会崩溃。所以要先检查文件是否成功打开:
if (fp == NULL) { printf("Failed to open file!\n"); system("pause"); return 1; }
修正后的完整代码
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <windows.h> int main() { char input[50], file[50], word[50]; int wordcount = 0; // 初始化计数变量 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(file, "r"); // 修正fopen调用 // 检查文件是否成功打开 if (fp == NULL) { printf("Failed to open the specified file!\n"); system("pause"); return 1; } while (fscanf(fp, "%s", word) != EOF) { if (strcmp(word, input) == 0) { // 修正strcmp判断逻辑 printf("found the word %s\n", input); wordcount++; } } printf("The word %s shows up %d times\n", input, wordcount); // 修正拼写错误:world -> word fclose(fp); // 别忘了关闭文件 system("pause"); return 0; }
另外还帮你修正了一个小拼写错误:最后printf里的The world改成了The word,还有加上了fclose(fp),养成用完文件就关闭的好习惯。
内容的提问来源于stack exchange,提问作者Neil




