返回时c++字符串后面的垃圾

Junk after C++ string when returned

本文关键字:c++ 字符串 返回      更新时间:2023-10-16

我刚刚完成了c++完整参考,我正在创建几个测试类来更好地学习这门语言。我创建的第一个类模仿Java StringBuilder类,返回字符串的方法如下:

char *copy = new char[index];
register int i;
for(i = 0; i <= index; i++) {
    *(copy + i) = *(stringArray + i);
} //f
return copy;

stringArray是存放正在构建的字符串的数组,index表示已输入的字符数。

当字符串返回时,后面有一些垃圾,例如如果创建的字符串是abcd,那么结果是abcd,后面有10个随机字符。这些垃圾是从哪里来的?如果您需要查看更多代码,请询问。

您需要以空终止字符串。那个空字符告诉计算机什么时候字符串结束。

char * copy = new char[ length + 1];
for(int i = 0; i < length; ++i) copy[i] = stringArray[i];
copy[length] = 0; //null terminate it

只有几件事。在尽可能小的范围内声明int变量以获得良好实践。这是一个很好的实践,这样不需要的作用域就不会被填充,也更容易调试和跟踪。并删除'register'关键字,让编译器确定需要优化的内容。尽管register关键字只是提示,但除非您的代码对性能要求非常严格,否则现在请忽略此类内容。

索引是否包含您正在复制的字符串的长度,包括终止null字符?如果没有,那就是你的问题了。

如果stringarray不是以空结束的——这在某些情况下是可以的——你需要确保你将空结束符附加到你返回的字符串上,否则你就没有一个有效的C字符串,正如你已经注意到的那样,你会在它后面得到一堆"垃圾字符"。这实际上是一个缓冲区溢出,所以它并不像看起来那么无害。

你们必须把代码修改如下:

char *copy = new char[index + 1];

在复制循环之后,您需要添加以下代码行来添加空终止符:

 copy[index] = '';

一般来说,我建议使用strncpy()将字符串从stringArray中复制出来,而不是手动滚动循环——在大多数情况下,strncpy由库供应商优化以获得最大性能。但是,您仍然必须确保生成的字符串以空结束。