Вы правы, что строка
sprintf(a, "%s %s", a, b);
вызовет неопределенное поведение , поскольку строки источника и назначения перекрываются.
Однако строка
sprintf(a + strlen(a), "%s %s", a, b);
будет по-прежнему вызывать неопределенное поведение, поскольку a + strlen(a)
является адресом завершающего нулевого символа строки a
(что означает исходную строку a
и строка назначения a + strlen(a)
все еще пересекаются). Если строки не должны перекрываться, то строка должна быть изменена на следующее:
sprintf(a + strlen(a) + 1, "%s %s", a, b);
Поскольку перекрытия больше нет, строка не будет вызывать неопределенное поведение.
Если вы хотите иметь возможность копировать память из одного буфера памяти в другой буфер памяти, который перекрывает первый буфер памяти, тогда я рекомендую использовать функцию memmove
. В отличие от memcpy
, функция memmove
разрешает перекрывающиеся буферы памяти и ведет себя так, как если бы содержимое было сначала записано во временный буфер перед записью в буфер назначения. Следовательно, поведение этой функции не является неопределенным, но четко определено, даже если буферы перекрываются. К сожалению, для строк не существует эквивалентной функции strmove
.