C ++-Char数组以某种方式初始化为错误的大小

时间:2019-02-09 03:58:42

标签: c++ arrays qt gcc

我正在从头开始编写一个字符串类,作为类分配的一部分,但是在编写子字符串函数时遇到了麻烦。据我所知,这与初始化为错误大小的字符数组有关。

据我所知,字符串类中的其他所有东西都运行良好。我是在Ubuntu上的Qt Creator中编写的。

string string::substring(unsigned int startIndex, unsigned int endIndex) const {
    if (startIndex >= endIndex) {
        string s;
        return s;
    }
    if (endIndex > length) endIndex = length;

    int rlength = endIndex - startIndex;

    char* r = new char[rlength];

    for (int i = 0; i < rlength; i++) {
    r[i] = chars[i + startIndex];

    }

    string s2(r);
    return s2;
}

我希望看到的:

"This is a test".substring(0, 4) -> "This"
"This is a test".substring(6, 8) -> "is"
"This is a test".substring(9, 10) -> "a"

我实际上看到的是

"This is a test".substring(0, 4) -> "This"
"This is a test".substring(6, 8) -> "is"
"This is a test".substring(9, 10) -> "a�;�"

从我自己的故障排除中看,r似乎已以某种方式初始化为比预期的大的大小,在预期的文本之后留下了一些垃圾。有谁知道为什么会这样?

1 个答案:

答案 0 :(得分:2)

尽管您没有提供string(char*)构造函数的代码,但它可能判断字符串长度的唯一方法是扫描空终止符。但是,代码中的字符数组r没有空终止。

在数组的长度上添加一个char,并将其设置为'\0'可以解决此问题:

char* r = new char[rlength+1];
for (int i = 0 ; i < rlength ; i++) {
    r[i] = chars[i + startIndex];
}
r[rlength] = '\0';