#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
char* StrCat(char* str1, char* str2);
class String
{
public:
String(int);
String(const String&);
void showArray();
void operator +(char *s) //что должен выполнить оператор +
{
StrCat(*str, s); //сложение строк
}
char* &operator[](int j);
~String();
private:
char **str;
int sizeOfArray;
};
String::String(int size)
{
sizeOfArray = size;
str = new char *[sizeOfArray];
for (int i = 0; i < sizeOfArray; i++)
{
str[i] = new char[2048];
}
}
String::String(const String& obj)
{
sizeOfArray = obj.sizeOfArray;
str = new char *[sizeOfArray];
for (int i = 0; i < sizeOfArray; i++)
{
str[i] = new char[2048];
str[i] = obj.str[i];
}
}
char* &String::operator[](int j)
{
if (sizeOfArray <= j)
{
exit(1);
}
return str[j];
}
void String::showArray()
{
for (int i = 0; i < sizeOfArray; i++)
{
cout << str[i] << " | ";
}
cout << endl << endl;
}
String::~String()
{
delete str;
}
int StrLen(char* _str)
{
int size = 0;
for (; _str[size] != 0; size++);
return size;
}
void StrCpy(char* in_str, char* src_str)
{
for (int i = 0; i < StrLen(in_str); i++)
in_str[i] = src_str[i];
}
char* StrCat(char* str1, char* str2)
{
int sz = StrLen(str1) + StrLen(str2);
char* ts = new char[sz + 1];
for (int i = 0; i < StrLen(str1); i++)
ts[i] = str1[i];
for (int ii = StrLen(str1), j = 0; ii <= sz; ii++, j++)
ts[ii] = str2[j];
delete str1;
str1 = ts;
return str1;
}
int main()
{
String a(3);
String b(6);
a[0] = "1";
a[1] = "2";
a[2] = "3";
a[0] + a[1];
cout << a[0];
system("pause");
}
Не понимаю ошибку(((, надо сделать a[0] + a[2] - например, и чтобы в a[0] добавилась строка a[2];
Ваша StrCat(char* str1, char* str2)
сначала принимает указатели по значению, а затем делает с ними это:
str1 = ts;
«По значению» означает, что str1
— это всего лишь копия того *str
, который вы передали функции при вызове. Вам же нужна передача по ссылке. Измените объявление функции на:
void StrCat(char*& str1, char* str2)
Только после этого любая модификация str1
будет отражаться на *str
.
P. S.: По хорошему, бинарные операторы (включая +
) не должны трогать свои параметры, а возвращать вместо этого новое значение. Вам по смыслу нужен модифицирующий оператор +=
:
a[0] += a[1];
Его объявление практически ничем не отличается от такового для обычного плюса:
class String
{
public:
void operator +=(const char *s)
{
StrCat(*str, s);
return *this;
}
// ...
};
Обратите внимание, что я защитил данные по указателю s
от случайного изменения, сделав этот указатель константным.
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
Подскажите, а способа как использовать <vector> для разделения нужной мне строки на подстроки, которые будут заноситься в массив, нет?
Решение задачи проходит только на 67,20 из 100И я совершенно не могу понять в чем проблема, перепробовал все что знаю, иногда выдает неправильный...