строка — конкатенация массива символов C ++

Я пытаюсь перегрузить знак плюс, чтобы объединить две строки, но получаю сообщение об ошибке.

VS 2010 дает утверждение не удалось сообщение: «Выражение: (L» Буфер слишком мал » && 0) «; Файл: f: \ dd \ vctools \ crt_bld \ self_x86 \ crt \ src \ tcscat_s.inl; Линия: 42

Что вы думаете не так с моим кодом?

#include "stdafx.h"
class MyString{
int l;  // the length of the array pointed by buf
char *buf; //pointer to a char array
public:
...
MyString(char *);
friend MyString operator+(MyString &,MyString &);
...
};

MyString::MyString(char *p)
{
buf=new char[strlen(p)+1];
strcpy_s(buf,strlen(p)+1,p);
l=strlen(p)+1;
}

MyString operator+(const MyString &a,const MyString &b)
{
MyString result("");
result.l=a.l+b.l;
delete[] result.buf;
result.buf=new char[result.l+1];
result.buf[0]='\0';
strcat_s(result.buf,result.l+1,a.buf);
strcat_s(result.buf,result.l+1,b.buf);
return result;
}

int _tmain(int argc, _TCHAR* argv[])
{
MyString a("hello"),b("world"),c("");
c=a+b;
system("pause");
return 0;
}

Это работает сейчас! Всем спасибо!

0

Решение

В операторе + переменная «MyString result» была объявлена ​​в стеке и впоследствии возвращена по ссылке, что было неверно.

Затем ОП был отредактирован. Переменная «результат» больше не объявлялась в стеке, а вместо этого размещалась в куче. Однако затем произошла утечка памяти.

Здесь нужно вернуться по значению, а также объявить «MyString result» в стеке. Также убедитесь, что у вас есть конструктор копирования. И деструктор в этом отношении.

Вы также должны сделать так, чтобы ваш конструктор принимал const char *.

1

Другие решения

strcat_s(result->buf,strlen(a.buf),a.buf);
strcat_s(result->buf,strlen(b.buf),b.buf);

Второй параметр strcat_s это размер буфера назначения, а не размер строки, которая должна быть добавлена.
Так что вам нужно изменить это на

strcat_s(result->buf,result->l+1,a.buf);
strcat_s(result->buf,result->l+1,b.buf);

Остальная часть оператора + реализация также нарушена, как уже отмечалось другими. Создание экземпляра и его возврат по значению — это нонсенс. Просто создайте экземпляр результата в стеке и верните его по значению.

2

Так должно быть result.buf=new char[result.l+1]; чтобы разрешить для нулевого символа.

1