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
相关产品推荐
相关产品推荐

