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

文件行/字符/单词统计程序计数错误问题求助

搞定你的单词统计程序计数问题

嘿,我帮你捋捋现有代码里的问题,这些应该就是导致不管选啥选项计数都不对的核心原因:

1. 命令行选项判断完全搞反了!

你写的if (strcmp("-c",argv[1]))逻辑彻底颠倒——strcmp函数返回0才代表两个字符串相等,现在的写法是当输入的选项不是-c的时候才进入分支,这肯定和你预期的功能完全相反啊!如果-c是用来统计字符的选项,正确的判断应该是:

if (strcmp("-c", argv[1]) == 0) {
    // 这里写字符统计的逻辑
}

2. 没检查文件是否能正常打开

你直接用fopen打开文件,但没判断返回的file是不是NULL。要是文件不存在、没有读取权限,程序直接操作空指针,轻则计数乱跳,重则直接崩溃。必须加上错误处理:

FILE *file = fopen(argv[i], "r");
if (file == NULL) {
    fprintf(stderr, "糟了,打不开文件: %s\n", argv[i]);
    continue; // 跳过这个有问题的文件,继续处理其他文件
}

3. 读取循环未完成(从你给出的代码片段看)

你的while((c = fgetc(file)...没写完,这里要注意两点:

  • 循环条件得写完整:while ((c = fgetc(file)) != EOF),不然程序根本不知道什么时候停止读取
  • 如果是统计单词,得判断单词的边界——比如从空白字符切换到非空白字符时,才算一个新单词;如果是统计字符,就简单了,每读一个非EOF的字符就给计数+1

4. 文件用完后未关闭

处理完每个文件后,一定要用fclose(file)把文件关掉,不然会占用系统资源,也可能影响后续的计数准确性。

给你整个修正后的示例片段(以字符统计为例)

#include <stdio.h>
#include <stdbool.h>
#include <string.h>

int main(int argc, char **argv){
    int totalcount = 0; // 保存总计数
    // 先检查参数是否合法
    if (argc < 3) {
        fprintf(stderr, "用法: %s <选项> <文件1> [文件2...]\n", argv[0]);
        return 1;
    }

    for(int i = 2; i < argc; i++){
        int count = 0; // 单个文件的计数
        int c; // 临时存储读取的字符
        FILE *file = fopen(argv[i], "r");
        if (file == NULL) {
            fprintf(stderr, "错误:打不开文件 %s\n", argv[i]);
            continue;
        }

        if (strcmp("-c", argv[1]) == 0) { // 正确判断字符统计选项
            while((c = fgetc(file)) != EOF) {
                count++; // 每个字符都计数+1
            }
            printf("文件 %s 的字符数: %d\n", argv[i], count);
            totalcount += count;
        }
        // 要是加单词统计选项,就在这儿加判断,比如判断"-w"
        // 单词统计需要状态变量,比如bool in_word = false,跟踪是否处于单词中
        fclose(file); // 用完记得关文件!
    }
    printf("总计数: %d\n", totalcount);
    return 0;
}

要是你要做单词统计,记得加个状态变量,比如bool in_word = false:当读到非空白字符且in_word是false时,计数+1并把in_word设为true;读到空白字符时把in_word设为false,这样就能准确统计单词数啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:08:05