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

C语言统计文本文件字符、单词、行数时计数偏多的问题咨询

代码逻辑错误点
  • 两层while循环重复读字符:外层while先调用fgetc读取了文件第一个字符直接丢弃,内层while才正式开始计数,导致首字符永远不参与统计
  • fgetc返回值类型错误:fgetc返回值为int类型(EOF是值为-1的int常量),用char类型存储cha会在char为无符号类型的环境下永远无法匹配EOF,导致死循环
  • 单词计数逻辑错误:当前逻辑是遇到任意空白符就对word加1,连续空白、行首尾空白都会导致重复计数,属于典型的「边缘触发」逻辑错误,正确应该是从非空白切换到空白时才计数一个单词,或者标记当前是否处于单词内部
  • 行数计数逻辑混乱:先在循环里遇到\n加1,结束后又强制对lne加1,输出时再减1,属于靠凑数值修正结果,一旦文件为空、末尾无换行符等场景就会出错
  • 空文件边界处理缺失:如果打开的是空文件,当前逻辑依然会输出错误的计数结果
修正后的完整代码
#include <stdio.h>

int main()
{
    FILE *fp = fopen("Part2.txt", "r");
    if (fp == NULL) {
        return 4;
    }

    int cha; // 必须用int存fgetc返回值
    int character = 0;
    int word = 0;
    int line = 0;
    int in_word = 0; // 标记当前是否处于单词内部

    while ((cha = fgetc(fp)) != EOF) {
        character++;

        // 行数统计:遇到换行符则行数+1
        if (cha == '\n') {
            line++;
        }

        // 单词统计:非空白切到空白时计数,且避开连续空白
        if (cha == ' ' || cha == '\t' || cha == '\n') {
            in_word = 0;
        } else if (in_word == 0) {
            in_word = 1;
            word++;
        }
    }

    // 补充最后一行没有换行符的情况:只要文件非空,行数要加1
    if (character > 0 && cha != '\n') {
        line++;
    }

    printf("\n");
    printf("Total number of characters = %d\n", character);
    printf("Total number of words      = %d\n", word);
    printf("Total number of lines      = %d\n", line);

    fclose(fp);
    return 0;
}
逻辑说明
  • 用in_word标记单词状态,只有从空白字符切换到非空白字符时才计数单词,避免连续空白、首尾空白导致的多计数问题
  • 读取结束后判断文件是否非空、最后一个字符是否是换行符,补充统计末尾无换行的最后一行
  • 去掉了嵌套的while循环和乱凑数值的加减1操作,所有计数逻辑自洽,兼容空文件、末尾无换行、连续空白等所有常见场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:36:03