0

我刚刚完成了 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 个随机字符。这个垃圾是哪里来的?如果您需要查看更多代码,请询问。

4

2 回答 2

1

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

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 关键字只是提示,除非您的代码对性能非常严格,否则暂时忽略此类内容。

于 2013-06-02T23:35:03.880 回答
0

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

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

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

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

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

 copy[index] = '\0';

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

于 2013-06-02T23:35:50.733 回答