C ++ - массив Char как-то инициализируется до неправильного размера - PullRequest
0 голосов
/ 09 февраля 2019

Я пишу строковый класс с нуля как часть назначения класса, и у меня возникают проблемы с написанием функции подстроки.Из того, что я могу сказать, это имеет отношение к массиву символов, инициализирующему неправильный размер.

Из того, что я могу сказать, все остальное в строковом классе работает прекрасно.Я пишу это в Qt creator на Ubuntu.

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 голосов
/ 09 февраля 2019

Хотя вы не предоставили код для конструктора 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';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...