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

C语言提取文件首词并对比统计的异常问题求助

问题排查与修复:提取每行首词并统计匹配词汇数量

问题场景

需要提取文件中每行字符串的首词,与若干指定词汇对比,匹配则对应计数器递增,最终展示各词汇的统计数量。但现有代码统计异常:仅能正确统计前两个词汇数量(其余为0),或所有统计结果均为0;新增判断条件后计数器也无法正常累加。

现有代码的问题分析

  • 首词提取逻辑完全错误:代码通过vetor[i] == 'A' && vetor[i + 6] == 'a'硬编码字符位置来定位"Alameda",这不是提取首词的通用逻辑——首词应该是行开头第一个非空白字符到第一个空白字符的内容,硬编码位置只会匹配特定位置的特定字符,无法处理正常的行首词。
  • 循环变量被非法篡改:内层for循环的i在嵌套的while循环中被修改,导致for循环的遍历逻辑混乱,出现越界或跳过内容的情况,无法完整处理每行数据。
  • 匹配逻辑硬编码:仅针对"Alameda"写死了提取7个字符的逻辑,无法扩展到其他词汇,且如果行首不是该词则完全不会处理。
  • 未处理行首空白:如果行开头存在空格、制表符等空白字符,代码会直接跳过,无法提取真正的首词。

修复后的代码实现

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

int main() {
    FILE *fpl = fopen("your_file.txt", "r");
    if (fpl == NULL) {
        printf("Can't open file\n");
        return 1;
    }
    printf("File opened\n");

    char vetor[500];
    char firstword[11];
    int alamedas = 0;
    // 可按需添加更多统计词汇与计数器
    int square_count = 0;

    while (fgets(vetor, sizeof(vetor), fpl)) {
        // 跳过行首空白字符(空格、制表符、换行符等)
        char *ptr = vetor;
        while (isspace((unsigned char)*ptr)) {
            ptr++;
        }
        if (*ptr == '\0') {
            continue; // 空行直接跳过
        }

        // 定位首词的结束位置:第一个空白字符
        char *end = ptr;
        while (*end != '\0' && !isspace((unsigned char)*end)) {
            end++;
        }

        // 提取首词,避免数组溢出
        int word_len = end - ptr;
        if (word_len >= sizeof(firstword)) {
            word_len = sizeof(firstword) - 1;
        }
        strncpy(firstword, ptr, word_len);
        firstword[word_len] = '\0'; // 手动添加字符串结束符

        // 匹配指定词汇并累加计数器
        if (strcmp(firstword, "Alameda") == 0) {
            alamedas++;
        }
        if (strcmp(firstword, "Square") == 0) {
            square_count++;
        }
    }

    fclose(fpl);
    printf("Alamedas - %d\n", alamedas);
    printf("Square - %d\n", square_count);

    return 0;
}

修复关键点说明

  • 正确提取首词:通过isspace跳过行首空白,再定位第一个空白字符作为首词结束位置,确保提取的是真正的行首词汇。
  • 避免数组溢出:使用strncpy限制复制长度,手动添加字符串结束符,防止firstword数组越界。
  • 清晰的循环逻辑:不再篡改循环变量,确保每行数据被完整处理。
  • 可扩展性:只需新增strcmp判断和对应计数器,即可支持多个指定词汇的统计。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 02:50:15