Моя строка в стиле с действует очень странно
Я создал объект String, который просто содержит строку char*; член. Я перегружаю оператор + путем копирования члена из моего объекта, а не члена параметра, в переменную char*. Но по какой-то причине я получаю около 16 добавленных символов-гигантов, когда печатаю результат (перегрузка приведения на 100% хороша). Я сузил его до char* sum = new char[length], это проблема. Я проверил strlen(сумма), и он оказался равным 22, когда он должен быть длиной 6 букв. У кого-нибудь есть подсказка, в чем может быть проблема?
String String::operator+(const String& rhs)
{
int length = strlen(string) + strlen(rhs.string);
char* sum = new char[length];
for(int i=0;i<strlen(string);i++)
sum[i] = string[i];
for(int i=0;i<strlen(rhs.string);i++)
sum[strlen(string) +i] = rhs.string[i];
String s(sum);
return s;
}
редактировать: теперь тарабарщина исчезла, но я все еще добавляю = = = к моему результату, например: "1" + "2" + "3" теперь "1=2=3". Является ли это результатом нулевого терминатора, интерпретируемого неправильно?
отредактируйте еще раз: не берите в голову, был действительно лозунг и установил [длина +1] = '\0' вместо [длина]. Еще раз спасибо за отличные ответы!
3 ответа
strlen
говорит вам, сколько символов существует от начала строки до, но не до завершающего '\0'. Когда вы выделяете новую строку, вы должны оставить место для завершающего `\0':
char *sum = new char[length + 1];
и добавьте `\ 0 'после копирования двух строк.
Вы размещаете length
символы - недостаточно места для хранения завершающего нуля. Кроме того, вы не пишете завершающий ноль. Строки в стиле C заканчиваются нулем.
И сохранить результат strlen
в локальных переменных. Если компилятор не знает, что он может безопасно оптимизировать strlen
(не гарантировано), повторные вызовы сделают вашу функцию невероятно медленной.
Вы не выделяете память для завершения '\0'
персонаж. Вы должны выделить length+1
байты для объединения. Кроме того, вы должны установить sum[length] = '\0'
,