C语言读取文本文件存数组过滤字符串时未初始化内存报错求解
代码存在的核心问题
- 内存泄漏+无效赋值:执行
lines[sizelines] = malloc(50);后立刻将_strdup(s)的返回值覆盖该指针,之前申请的50字节内存永久丢失,属于无意义操作。_strdup本身会自动申请足够存储传入字符串的堆内存,不需要提前手动分配。 - 空行过滤逻辑失效:现有逻辑仅跳过首字符为
/(注释行)和空格的行,但文本中的空行首字符是换行符\n,不会被过滤,会被存入数组。 - 数组遍历逻辑完全错误:循环条件写为
i < strlen(lines),lines是存储字符指针的数组,不是以\0结尾的字符串,strlen会读取未初始化的野内存计算长度,这就是Visual Studio报未初始化内存警告的直接原因,正确的遍历边界应该是之前记录的有效元素个数sizelines。 - 字符串匹配逻辑错误:使用
strcmp("<Name>", lines[i])比较整行内容,但存储的行内容是类似<Name>Peter</Name>的完整字符串,和固定字符串<Name>永远不可能相等,判断条件永远不成立,自然没有输出。 - 文件操作存在空指针风险:如果文件打开失败走到
else分支,后续依然会执行fclose(myFile),此时myFile为NULL,会触发程序崩溃。 - 内存释放不完整:
_strdup申请的堆内存使用完后没有手动释放,存在内存泄漏。
修正后可运行代码
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { const char* file_path = "test1.txt"; char read_buf[500]; char* lines[100]; int line_count = 0; printf("%s \n\n", file_path); FILE* myFile = fopen(file_path, "r"); if (myFile == NULL) { printf("Wrong file"); return 1; // 文件打开失败直接退出,避免后续空指针fclose } while (fgets(read_buf, 500, myFile) != NULL) { // 跳过注释行、空行、首字符为空格的行 if (read_buf[0] == '/' || read_buf[0] == '\n' || read_buf[0] == ' ') continue; // 移除多余的提前malloc,避免内存泄漏 lines[line_count] = _strdup(read_buf); line_count++; } fclose(myFile); // 按有效行数遍历数组,避免读未初始化内存 for (int i = 0; i < line_count; i++) { const char* cur_line = lines[i]; const char* PATTERN1 = "<Name>"; const char* PATTERN2 = "</Name>"; char* target = NULL; char* start, * end; // 直接用strstr查找标签,不需要整行strcmp匹配 if (start = strstr(cur_line, PATTERN1)) { start += strlen(PATTERN1); if (end = strstr(start, PATTERN2)) { target = (char*)malloc(end - start + 1); memcpy(target, start, end - start); target[end - start] = '\0'; } } if (target) { printf("%s\n", target); free(target); } // 释放_strdup申请的行内存 free(lines[i]); } return 0; }
运行结果
Peter Anna
内容的提问来源于stack exchange,提问作者nickpts
相关产品推荐
相关产品推荐

