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

读取TXT文件时指针误用导致重复输出同一字符串的问题

问题分析与解决

你的代码核心问题在于局部变量的生命周期:

在while循环里定义的char buffer2[7];是栈上的局部变量,每次循环迭代时,它会被分配到栈上的同一区域(循环结束后这块内存会被回收复用)。你把plates[idx]指向buffer2的地址,相当于数组所有元素都指向同一块内存。每次循环更新buffer2的内容都会覆盖之前的数据;循环结束后,这块内存已经不属于buffer2,此时访问它属于未定义行为,最终输出自然是最后一次写入的字符串。

修复方案

方案1:动态内存分配(推荐)

给每个车牌字符串独立分配堆内存,确保每个指针指向不同的内存块,不会被覆盖:

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

int main(int argc, char *argv[])
{
    // 检查命令行参数
    if (argc != 2)
    {
        printf("Usage: ./read infile\n");
        return 1;
    }

    char buffer[7];
    char *plates[8];

    FILE *infile = fopen(argv[1], "r");
    int idx = 0;

    // 限制idx避免数组越界
    while (fread(buffer, 1, 7, infile) == 7 && idx < 8)
    {
        buffer[6] = '\0'; // 替换换行符为字符串结束符
        // 分配7字节内存(包含'\0')
        plates[idx] = malloc(7);
        if (plates[idx] == NULL) // 检查内存分配是否成功
        {
            perror("malloc failed");
            return 1;
        }
        strcpy(plates[idx], buffer);
        idx++;
    }

    // 只打印实际读取的条目,避免空指针访问
    for (int i = 0; i < idx; i++)
    {
        printf("%s\n", plates[i]);
        free(plates[i]); // 释放分配的堆内存,避免泄漏
    }

    fclose(infile); // 关闭文件,释放资源
    return 0;
}

方案2:使用二维数组

直接将plates定义为二维字符数组,每个元素自带独立存储空间,无需指针:

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

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        printf("Usage: ./read infile\n");
        return 1;
    }

    char buffer[7];
    char plates[8][7]; // 二维数组,8个元素,每个可存7个字符

    FILE *infile = fopen(argv[1], "r");
    int idx = 0;

    while (fread(buffer, 1, 7, infile) == 7 && idx < 8)
    {
        buffer[6] = '\0';
        strcpy(plates[idx], buffer);
        idx++;
    }

    for (int i = 0; i < idx; i++)
    {
        printf("%s\n", plates[i]);
    }

    fclose(infile);
    return 0;
}

额外注意点

  • 原代码未限制idx最大值,若文件条目超过8个会导致数组越界,修复后添加了idx < 8的判断;
  • 原代码未关闭文件infile,修复后补充了fclose(infile),养成资源释放的习惯;
  • 动态内存分配版本必须用free释放内存,避免内存泄漏。

内容的提问来源于stack exchange,提问作者A.Bowl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 05:30:47