C语言简历关键词统计程序 文件读取及运行异常求助
C语言关键词统计程序异常排查方案
已解决问题说明
- 前期触发
Could not open files报错的根因是相对路径寻址错误:C程序运行时的文件相对路径以编译生成的可执行文件所在目录为基准,而非源文件存放目录。你将两个txt文件移动到正确路径后问题解决,该处理逻辑正确。
coK = 0;行触发异常的根因与排查
该类运行到赋值语句抛出异常的场景,90%以上为内存访问违规,即程序尝试写入没有操作权限、未分配或已被破坏的内存地址。注意:踩内存导致的异常不一定在出错代码行立刻触发,经常会延后到后续的内存操作位置才报错。
按优先级从高到低排查以下常见错误:
coK变量定义错误- 如果
coK被定义为指针类型(如int *coK;),未提前分配合法内存就直接执行*coK = 0;,会因为野指针指向随机非法地址触发访问违规。修复方式:如果只是做计数器,直接定义为普通整型变量int coK;即可;如果必须用指针,先通过malloc分配对应长度的合法内存再操作。
- 如果
- 数组越界踩内存
这类作业最常见的错误是存储关键词的字符数组/计数数组开的空间过小:比如预设最多存10个关键词、每个关键词最长20字符,但实际keywords.txt里的关键词数量更多、或者单个关键词长度超过数组预留长度(字符串需要额外1字节存结束符\0),读取内容时越界写入,破坏了栈上coK变量对应的内存空间,执行到coK = 0;赋值时就会触发异常。 - 文件指针判空遗漏
检查文件打开后的判空逻辑,是否只校验了其中一个文件的指针,漏判另一个文件打开失败的场景。如果后续逻辑往空文件指针指向的结构写入内容,会破坏内存,同样可能延后到coK = 0;行才抛出异常。
参考实现核心逻辑
你可以对照以下无内存问题的核心代码调整你的实现:
#include <stdio.h> #include <string.h> // 预留足够空间,根据实际文件内容调整上限即可 #define MAX_KEY_NUM 100 #define MAX_WORD_LENGTH 50 int main() { FILE *key_fp = fopen("keywords.txt", "r"); FILE *resume_fp = fopen("resume.txt", "r"); // 两个文件指针必须同时判空 if (key_fp == NULL || resume_fp == NULL) { printf("Could not open files\n"); return 1; } char keywords[MAX_KEY_NUM][MAX_WORD_LENGTH] = {0}; int count[MAX_KEY_NUM] = {0}; int coK = 0; // 计数器直接定义为普通int,不存在内存问题 // 读取关键词时严格限制长度和数量,避免越界 while (coK < MAX_KEY_NUM && fscanf(key_fp, "%49s", keywords[coK]) == 1) { count[coK] = 0; coK++; } // 此处省略简历内容读取、逐词匹配计数逻辑,注意读入字符串时同样要限制长度防溢出 // ... // 执行完文件操作后关闭指针 fclose(key_fp); fclose(resume_fp); // 输出统计结果 for (int i = 0; i < coK; i++) { printf("%s: %d\n", keywords[i], count[i]); } return 0; }
快速验证技巧
可以在coK = 0;代码行前加打印语句,输出当前已读取到的关键词数量,和keywords.txt里的实际关键词数做对比:如果数值异常偏大/偏小,基本可以确定是读取关键词时发生了数组越界。
内容的提问来源于stack exchange,提问作者C beginner
相关产品推荐
相关产品推荐

