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

C++中string类copy()函数为何出现该输出?求解运行逻辑

C++ string::copy() 输出乱码原因

问题代码

#include <iostream>
#include <string>
using namespace std;
int main(){
    string str4 = "welcome";
    char str5[10];
    char str6[10];
    cout << str4 << endl;
    str4.copy(str5, str4.size());
    cout << str5 << endl;
    str4.copy(str6, 3);
    cout << str6 << endl;

    return 0;
}

运行输出

welcome
welcome�v��`
wel

疑问:为什么copy()函数会产生这样的输出?


原因分析

C++的string::copy()函数只会复制指定长度的字符,不会自动添加字符串终止符'\0'。而cout输出char数组时,会持续读取内存直到遇到'\0'才停止,所以copy()完成后,char数组里只有复制过来的字符,没有终止符,后续内存中的随机垃圾数据会被一并输出,也就是你看到的乱码。

具体来看:

  • 对str5,copy()复制了"welcome"的7个字符,但str5中没有'\0',cout读完这7个字符后,继续读取后面内存的随机内容,直到碰到某个'\0'才停止,因此出现乱码后缀。
  • 对str6,复制了3个字符"wel",刚好后续内存中碰巧存在'\0'(未初始化数组的该位置恰好为0),所以输出正常,但这是偶然情况,绝对不能依赖。

解决方法

要避免乱码,复制后手动给char数组添加终止符即可:

// 复制str4到str5后添加终止符
str4.copy(str5, str4.size());
str5[str4.size()] = '\0'; // 需确保数组长度足够容纳终止符

// 复制前3个字符到str6后添加终止符
str4.copy(str6, 3);
str6[3] = '\0';

或者直接使用strcpy(需包含<cstring>头文件),它会自动添加终止符:

strcpy(str5, str4.c_str());

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 16:33:23