You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动