返回C ++字符串后的垃圾

时间:2013-06-02 23:30:17

标签: c++ string

我刚刚完成了C ++ The Complete Reference,我正在创建一些测试类来更好地学习语言。我创建的第一个类模仿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个随机字符。这个垃圾来自哪里?如果您需要查看更多代码,请询问。

2 个答案:

答案 0 :(得分:1)

您需要null终止字符串。该null字符告诉计算机何时字符串结束。

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关键字只是暗示,除非你的代码在性能上非常紧张,否则暂时忽略这样的东西。

答案 1 :(得分:0)

index是否包含要复制的字符串的长度,包括终止空字符?如果没有,那就是你的问题。

如果stringArrary不是以null结尾 - 在某些情况下可能没问题 - 你需要确保将null终结符附加到你返回的字符串,否则你没有有效的C字符串,因为你已经注意到,你得到一堆“垃圾字符”。这实际上是一个缓冲区溢出,所以它并不像看起来那么无害。

您必须按如下方式修改代码:

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

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

 copy[index] = '\0';

一般情况下,我建议使用strncpy()从stringArray中复制字符串,而不是手动循环 - 在大多数情况下,库供应商会优化strncpy以获得最佳性能。但是,您仍然必须确保结果字符串为空终止。