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
相关产品推荐
相关产品推荐

