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

