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

仿wc程序行计数变量始终为0的问题求助

问题分析与修复

你的行计数始终为0,是由几个关键错误导致的,逐一解决如下:

1. 文件指针未重置到开头

你用fseek(file, 0L, SEEK_END)获取文件字节数后,文件指针停在了文件末尾,此时后续的getc(file)直接返回EOF,循环根本不会执行,自然行计数为0。

解决方法:在开始行计数前,用rewind(file)将指针重置到文件开头,或者再次调用fseek(file, 0L, SEEK_SET)。

2. 条件判断用了赋值而非比较

代码中if (chr = '\n')是赋值操作(把'\n'赋值给chr),不是相等比较。即使循环执行,这个条件也会始终为真(因为'\n'的ASCII值非0),导致错误计数;但因为前面指针在末尾,这个问题没暴露出来。

正确写法是用双等号:if (chr == '\n')。

3. 字符变量类型错误

getc()返回的是int类型(包含EOF这个超出char范围的值),如果用char chr存储,可能会因为符号扩展问题无法正确识别EOF,导致循环异常。

需要把chr的类型改为int。

4. 循环逻辑跳过了第一个字符

你的代码先执行chr = getc(file);,进入循环后又立刻chr = getc(file);,这会跳过文件的第一个字符。如果文件开头是换行符,会漏计一行;同时如果文件为空,也会导致错误。

调整循环逻辑,让getc()在循环内统一执行。


修正后的完整代码

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[]) {
    if (argc == 2) {
        FILE* file = fopen(argv[1], "r");
        int chr;

        if (!file) {
            perror("Error opening file");
            return EXIT_FAILURE;
        }

        // 获取字节数后重置指针
        fseek(file, 0L, SEEK_END);
        int bytes = ftell(file);
        rewind(file); // 重置到文件开头

        int lines = 0;
        while ((chr = getc(file)) != EOF) {
            if (chr == '\n')
                lines++;
        }
        
        int words = 0;

        printf("%d %d %d %s\n", lines, words, bytes, argv[1]);

        fclose(file);
    } else {
        printf("Usage:\n");
        printf("%s <-cml> <filename>\n", argv[0]);
        printf("%s <filename>\n", argv[0]);
    }

    return 0;
}

额外提示:全局变量FILE* file;没必要,直接在main里定义局部变量更安全。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 10:35:03