You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言无限循环问题:文件字符匹配代码陷入死循环求助

你的C语言代码无限循环及其他问题的修复方案

核心问题:导致无限循环的原因

你打开了目标文件fwif.txt,但读取字符时用的是getchar()——这个函数是从**标准输入(stdin)**读取字符,而非你打开的文件流。只要不手动输入EOF(Unix下按Ctrl+D,Windows下按Ctrl+Z),循环就永远不会终止。必须改用fgetc(file_content)从打开的文件中读取字符。

其他需要修复的问题

  • 未初始化变量:line_number没有初始值,初始状态是随机垃圾值,会导致行号计数完全错误,应初始化为1(文件第一行从1开始计数)。
  • 错误的错误提示:fopen失败时提示"Memory allocation failed"完全不对,应该改成"Failed to open file"这类准确描述。
  • 错误的资源释放:free(file_content)是错误操作,FILE*是文件流指针,不是malloc分配的内存,必须用fclose(file_content)关闭文件。
  • 字符串数组越界风险:char actual_word[10] = "sylvestric";中,"sylvestric"是10个字符,但C字符串需要末尾的\0终止符,数组大小至少要11。更稳妥的写法是char actual_word[] = "sylvestric";,让编译器自动计算大小。
  • 换行判断逻辑冗余:你现在先执行putchar(character)再判断是否是换行,完全没必要绕弯子,直接判断字符本身即可。另外换行后建议重置匹配计数器,避免跨行匹配单词的不合理情况。
  • 字符存储类型错误:char character应改成int character,因为fgetc返回的是int类型(可能是字符ASCII值或EOF,EOF是超出char范围的负数),用char存储会导致EOF判断失效。

修复后的完整代码

#include <stdio.h>

int main() {
    FILE *file_content = fopen("fwif.txt", "r");

    if (file_content == NULL) {
        printf("Failed to open file\n");
        return 1;
    }  

    char actual_word[] = "sylvestric";
    int word_counter = 0;
    int character;
    int line_number = 1;
    int word_size = 10;

    printf("Reading file for word....\n");
    while((character = fgetc(file_content)) != EOF) {
        putchar(character);
        if (character == '\n') {
            line_number++;
            word_counter = 0;
        } else {
            if (actual_word[word_counter] == character) {
                word_counter++;
            } else {
                word_counter = 0;
            }
        }
        if (word_counter == word_size) {
            printf("\nWord found on line: %d\n", line_number);
            fclose(file_content);
            return 0;   
        }
    }
    printf("Word not found in file\n");
    fclose(file_content); 
    return 0;
}

内容的提问来源于stack exchange,提问作者Somto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 17:43:29