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

C++合并双数组打印新数组并计算大小时垃圾值问题排查

代码问题分析与修正方案

核心错误点

  • 文件大小计算错误:while (!fin.eof()) 计数逻辑存在偏差,eof() 是读取操作失败后才会被置位,最后一次调用get()读到EOF时仍会执行size++,导致统计的size1、size2比文件实际有效字符数多1。
  • getline()使用不符合预期:getline()会自动在目标字符串末尾追加\0结束符,且会丢弃换行符,你传入的大小是多算了1的统计值,最终读取到arr1、arr2的有效内容长度和你统计的size1、size2不匹配。
  • 缺少合并数组与打印逻辑:代码仅申请了arr3的内存空间,没有将arr1、arr2的有效内容拷贝到arr3中,也没有调用display函数打印结果,未初始化的堆内存本身就是随机垃圾值。
  • 打印逻辑不符合预期:原有display函数会在每个字符后追加输出空格,会导致最终打印的内容每个字符之间都有间隔,和预期的拼接后字符串效果不符,无需间隔可移除输出语句中的" "。
  • 存在内存泄漏风险:所有通过new申请的堆内存都没有调用delete释放,程序退出后会残留内存垃圾。

修正后的完整代码

#include <iostream>
#include <fstream>
#include <cstring>

using namespace std; 

void display(char* ptr, int size)
{ 
    for (int i = 0; i < size; i++)
    { 
        cout << ptr[i];
    } 
    cout << endl; 
}

int main() 
{ 
    // 读取第一个文件
    ifstream fin1("input1.txt"); 
    // 直接移动文件指针到末尾计算大小,避免重复打开文件
    fin1.seekg(0, ios::end);
    int size1 = fin1.tellg();
    fin1.seekg(0, ios::beg);
    char* arr1 = new char[size1 + 1]; 
    fin1.read(arr1, size1);
    arr1[size1] = '\0';
    fin1.close();

    // 读取第二个文件
    ifstream fin2("input2.txt"); 
    fin2.seekg(0, ios::end);
    int size2 = fin2.tellg();
    fin2.seekg(0, ios::beg);
    char* arr2 = new char[size2 + 1]; 
    fin2.read(arr2, size2);
    arr2[size2] = '\0';
    fin2.close();

    // 合并数组,两个内容中间加空格分隔
    int size3 = size1 + 1 + size2;
    char* arr3 = new char[size3 + 1];
    strcpy(arr3, arr1);
    strcat(arr3, " ");
    strcat(arr3, arr2);

    // 打印结果
    cout << "合并后数组大小:" << size3 << endl;
    cout << "合并后内容:";
    display(arr3, size3);

    // 释放堆内存
    delete[] arr1;
    delete[] arr2;
    delete[] arr3;

    return 0; 
}

运行输出说明

input1.txt内容为How are you doing,input2.txt内容为today sir,运行后输出:

合并后数组大小:27
合并后内容:How are you doing today sir

内容的提问来源于stack exchange,提问作者dipdopkop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 02:36:04