2013-06-02 118 views
0

我刚刚完成了C++完整参考,并且创建了一些测试类来更好地学习该语言。我已模拟了Java StringBuilder类和返回字符串是如下的方法中的第一类:C++字符串返回后垃圾

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

return copy; 

字符串数组是保持正被建造的字符串数组,索引代表的字符的量已被输入。

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

+3

请注意,这里没有必要使用'register'(或者确实在任何地方......) –

+0

可能不是,本书只是建议使用register for for循环整数。 – Ghost

+1

'我<=索引'超出范围 – billz

回答

1

您需要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关键字只是暗示,除非你的代码对性能非常严格,现在忽略类似的东西。

+0

感谢user814628,解决了它。 – Ghost

+0

@Ghost请记得“接受”解决您问题的答案。 –

0

索引是否包含要复制的字符串的长度,包括终止空字符?如果它不那么那就是你的问题。

如果stringArrary不是以null结尾的 - 在某些情况下可以很好 - 您需要确保将空终止符附加到返回的字符串中,否则您没有有效的C字符串,已经注意到,它后面会出现一堆“垃圾角色”。这实际上是一个缓冲区溢出,所以它不像看起来那么无害。

你必须修改你的代码如下:

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

和复制循环之后,你需要添加下面的代码行添加空终止:

copy[index] = '\0'; 

一般来说,我建议使用strncpy()而不是手动循环来复制stringArray中的字符串 - 在大多数情况下,strncpy会被库供应商优化以获得最佳性能。尽管如此,您仍然必须确保生成的字符串是空的。

+0

我试过index + 1,但那不起作用。围绕它的正确方法是什么?存储在里面的字符串的长度通常比索引长。 – Ghost