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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:12:18