Ну, что-то типа этого, только искал стандартное, а не самописное.
Вариант Bell вполне устроил.
Кстати, в предложенном тобой коде мне не нравится то, что память
вызывается в функции, а освобождается в нее ее. То есть, тот, кто
использует функцию может даже не знать, что он что-то обязан освободить.
Здравствуйте, DemAS, Вы писали:
DAS>Кстати, в предложенном тобой коде мне не нравится то, что память DAS>вызывается в функции, а освобождается в нее ее. То есть, тот, кто DAS>использует функцию может даже не знать, что он что-то обязан освободить.
Здравствуйте, DemAS, Вы писали:
DAS>Ну, что-то типа этого, только искал стандартное, а не самописное. DAS>Вариант Bell вполне устроил.
sprintf более универсальная функция, чем этого требует твоя задача.
DAS>Кстати, в предложенном тобой коде мне не нравится то, что память DAS>вызывается в функции, а освобождается в нее ее. То есть, тот, кто DAS>использует функцию может даже не знать, что он что-то обязан освободить.
Здравствуйте, DemAS, Вы писали:
DAS>Ну, что-то типа этого, только искал стандартное, а не самописное.
Судя по всему, стандартной функции нет DAS>Вариант Bell вполне устроил.
Проверь на производительность, если это критично. ИМХО вариант с memcpy должен быть быстрее.
DAS>Кстати, в предложенном тобой коде мне не нравится то, что память DAS>вызывается в функции, а освобождается в нее ее. То есть, тот, кто DAS>использует функцию может даже не знать, что он что-то обязан освободить.
Ну это вопрос докуменитрования — strdup тоже выделяет память, которую должен освободить пользователь.
Так что можно просто переименовать concat в concat_and_dont_forget2free_result
Да, но к сожалению, если в этом месте будет ошибка вроде:
sprintf("%s%s", s1, s2, s3);
, то немаловероятно, что компилятор ее не заметит.
Это замечание относится ко всем функциям со строкой форматирования, потому может быть не стоит использовать их там, где можно обойтись функциями из <string.h>.
Здравствуйте, igna, Вы писали:
I>Это замечание относится ко всем функциям со строкой форматирования, потому может быть не стоит использовать их там, где можно обойтись функциями из <string.h>.
У меня решение было такое же как у Bell, но перегрузил Janus, а ответ уже дали... )
в добавок sprintf СЕРЬЕЗНО тормознее остальных решений...
Здравствуйте, Plague, Вы писали:
P>Здравствуйте, igna, Вы писали:
I>>Это замечание относится ко всем функциям со строкой форматирования, потому может быть не стоит использовать их там, где можно обойтись функциями из <string.h>.
P>У меня решение было такое же как у Bell, но перегрузил Janus, а ответ уже дали... )
Ну уж извиняйте
P>в добавок sprintf СЕРЬЕЗНО тормознее остальных решений...
Я в этом тоже признался
Если заменить первый strcat на strcpy, то и обнуление *dst будет не нужно.
И если писать свою функцию, то можно и об эффективности позаботиться, поскольку неизвестно заранее, не будет ли она когда-либо использована в ситуации, где будет важна максимальная скорость. Я имею ввиду то, что у тебя второй strcat пробегает строку с самого начала в поисках нуля.
И последнее (спорное): Я бы вернул указатель на конец строки, поскольку указатель на начало у вызывающего уже есть.
I>Если заменить первый strcat на strcpy, то и обнуление *dst будет не нужно.
I>И если писать свою функцию, то можно и об эффективности позаботиться, поскольку неизвестно заранее, не будет ли она когда-либо использована в ситуации, где будет важна максимальная скорость. Я имею ввиду то, что у тебя второй strcat пробегает строку с самого начала в поисках нуля.
I>И последнее (спорное): Я бы вернул указатель на конец строки, поскольку указатель на начало у вызывающего уже есть.
Все подобные функции возвращают dst.