我刚刚完成了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个随机字符。这个垃圾来自哪里?如果您需要查看更多代码,请询问。
答案 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以获得最佳性能。但是,您仍然必须确保结果字符串为空终止。