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

C++手写char数组子串函数返回值带垃圾字符,该如何解决?

问题成因
  • C++中cout输出char*类型的字符串时,会从起始指针位置一直向后读取内存,直到遇到\0(空终止符)才会停止输出。你的代码没有给截取的子串添加\0终止符,所以输出时会把子串后续的随机内存内容也打印出来,就出现了末尾的乱码、异常符号。
  • 你申请子串内存时只分配了l字节的空间,本身也没有预留存放\0的位置,就算想加终止符也会出现内存越界。
  • 额外补充:你外层的while循环遍历找起始下标的逻辑完全冗余,不需要遍历整个原字符串找下标i,直接从原数组的i位置开始拷贝内容即可,同时最好补充边界校验避免原字符串长度不足时出现越界访问。
修复方案
  1. 申请子串内存时多分配1字节,用来存放空终止符
  2. 拷贝完l个字符后,手动给子串的最后一位赋值\0
  3. 可选优化:删除冗余的遍历逻辑,增加边界校验,避免非法入参导致的异常
修复后完整代码
#include <iostream>
using namespace std;

char* substring(char t[],int i,int l){
    // 边界校验,拦截非法入参
    if (i < 0 || l <= 0 || t == nullptr) {
        char* empty = new char[1];
        empty[0] = '\0';
        return empty;
    }
    // 计算原字符串长度,避免越界访问
    int strLen = 0;
    while(t[strLen] != '\0') strLen++;
    if (i >= strLen) {
        char* empty = new char[1];
        empty[0] = '\0';
        return empty;
    }
    // 调整实际截取长度,避免超过原字符串剩余可用长度
    l = (i + l > strLen) ? (strLen - i) : l;
    // 多申请1字节空间存放终止符
    char* subs = new char[l + 1];
    int j = 0;
    while(j < l) {
        subs[j] = t[i + j];
        j++;
    }
    // 手动添加空终止符
    subs[l] = '\0';
    return subs;
}

// CHECKING
int main(){
  char t[20]="this is a string";
  char* res = substring(t,0,4);
  cout<<res;
  // 注意:堆上申请的内存使用完要手动释放,避免内存泄漏
  delete[] res;
  return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:36:04