C/C++

Можете объяснить пожалуйста строчки в этом коде С++

Код :
char * conc(string str1, string str2) { const int len3 = str1.length() + str2.length(); char * rc = new char[len3 + 1]; for(int x = 0; x < str1.length(); x++) rc[x] = str1[x]; for(int y = 0; y < str2.length(); y++) rc[y + str1.length()] = str2[y]; rc[len3] = '\0'; return rc; }
Буду благодарен за подробность )
Функция принимает две строки и какого-то хрена возвращает символьный указатель, по которому выделена память под объединение этих двух строк. Бинарный operator+ замечательно справляется с данной задачей!

#include <iostream>
#include <string>
using namespace std;
char* c_conc(const string& a, const string& b) {
const auto la = a.length();
const auto lb = b.length();
const auto ls = la + lb;
const auto length = ls + 1;
auto box = new char[length];
auto i = 0U;
while (i < la) {
box[i] = a[i];
++i;
}
auto j = 0U;
while (i < ls) {
box[i] = b[j];
++i;
++j;
}
box[i] = 0;
return box;
}
char* cpp_conc(const string& a, const string& b) {
const auto& ab = a + b;
const auto length = ab.length();
auto box = new char[length + 1];
ab.copy(box, length);
box[length] = 0;
return box;
}
int main() {
string hello = "Hello ";
string world = "world!\n";
auto c = c_conc(hello, world);
auto cpp = cpp_conc(hello, world);
auto stl = hello + world;
cout << c << cpp << stl << '\n';
delete[] c;
delete[] cpp;
system("pause > nul");
}
Федор Тушинский
Федор Тушинский
85 473
Лучший ответ
_Dani Yar_ Николай - от Вас ожидал string_view =)
Это не код, а исходный текст идиотской процедуры слияния двух строк
char * conc(string str1, string str2)
{
const int len3 = str1.length() + str2.length(); //число символов в двух строках
char * rc = new char[len3 + 1]; // выделили место под новую строку, в которую войдут две начальных
for(int x = 0; x < str1.length(); x++) rc[x] = str1[x]; // по одному символу переписываем содержимое одной
for(int y = 0; y < str2.length(); y++) rc[y + str1.length()] = str2[y]; // а потом второй строки
rc[len3] = '\0'; // добавляем признак конца строки
return rc;
}
Заметим, что по выходу из первого цикла х равно длине первой строки, потому если для выбора данных из второй мы используем другой счётчик, замена rc[y + str1.length()] на rc[y + х] существенно повысит быстродействие.
Весьма через одно место сделанная функция соединяющая две строки.
В коде несколько ошибок в т. ч. архитектурная + есть более прямые и эффективные способы это сделать (даже Сшный strcat был-бы лучше). Особенно плохо, что функция выделяет память внутри себя и не освобождает, но пользователь функции может об этом даже не догадываться, что может создать (и скорее всего и создает) утечку памяти.

Видимо по заданию было запрещено использовать оператор + на строках (?) =)

Объяснять особо нечего
получаем общую длину строки
выделяем память под эту строку + 1 символ под 0-терминатор.
первый цикл пробегает от начала первой строки до конца и последовательно копирует символы строки в rc
второй цикл делает аналогично со второй строкой. разница только что во втором цикле начальная позиция = длине 1ой строки.
дописывается 0-терминатор в конец новой строки.
возвращается rc.
Константин Рогожкин Поясню момент - освобождать её внутри фукнции в данном случае конечно нельзя - именно поэтому ошибка архитектурная. strcat н-р не случайно именно так устроен, что строка присоединяется к текущей, не выделяя памяти. Ну и ессно переход от string к char сущностям - тоже грубейшая архитектурная ошибка.

Если это какая-то внутренняя функция в классе - хозяин-барин... В общедоступном месте так делать совсем нельзя =)