История изменений
Исправление Sorcerer, (текущая версия) :
Почему?
- Пустое условие в цикле for, хотя внутри цикла оно присутствует
- В первой версии функции был возможен выход за пределы локального массива: применять strcat() в случае, когда нет гарантии того, что вся строка поместится в буфер, нельзя
- Во второй версии функции Вы внесли новый баг - при нулевом числе строк будет разыменование нулевого указателя, а затем выход за пределы передаваемого массива
- strcat() таким образом применять неэффективно: эта функция каждый раз в цикле будет искать конец строки от её начала. Нужно запоминать текущую позицию конца строки
- Двойного пробега по строкам (strlen ищет конец строки, как и strcat), как сделано во второй версии функции, тоже желательно избегать, т.к. на это расходуется существенное время. Можно сделать за один пробег, при необходимости довыделяя память реаллоком
- Эта функция вообще не нужна, т.к. если планируется много работать со строками, то нужно сделать так, чтобы их длины не пересчитывались каждый раз, то есть, передавались бы вместе с самими строками. И раз они будут передаваться, то вместо strcat нужно будет использовать memcpy, но это уже совсем другая история
Исходная версия Sorcerer, :
Почему?
- Пустое условие в цикле for, хотя внутри цикла оно присутствует
- В первой версии функции был возможен выход за пределы локального массива: применять strcat() в случае, когда нет гарантии того, что вся строка поместится в буфер, нельзя
- Во второй версии функции Вы внесли новый баг - при нулевом числе строк будет выход разыменование нулевого указателя, а затем выход за пределы передаваемого массива
- strcat() таким образом применять неэффективно: эта функция каждый раз в цикле будет искать конец строки от её начала. Нужно запоминать текущую позицию конца строки
- Двойного пробега по строкам (strlen ищет конец строки, как и strcat), как сделано во второй версии функции, тоже желательно избегать, т.к. на это расходуется существенное время. Можно сделать за один пробег, при необходимости довыделяя память реаллоком
- Эта функция вообще не нужна, т.к. если планируется много работать со строками, то нужно сделать так, чтобы их длины не пересчитывались каждый раз, то есть, передавались бы вместе с самими строками. И раз они будут передаваться, то вместо strcat нужно будет использовать memcpy, но это уже совсем другая история