strcat(s1, s2);
может привести к переполнению, поэтому мера предосторожности «В строке s1 должно быть достаточно места для хранения результата».
Предположим, что s1
может содержать N
символов: N-1
не- '\0'
+ нулевой символ .
Правильный способ использования strcat()
, когда в месте назначения недостаточно места?
Когда конкатенация может переполниться, я не вижу приложения для использования strcat()
,Вместо этого используйте другие функции.
Для обнаружения потенциального переполнения:
Проверка strlen(s1), strlen(s2)
до вызова.
size_t l1 = strlen(s1);
assert(l1 < N); // This really should be true already.
N -= l1;
size_t l2 = strlen(s2);
if (l1 >= N) Handle_TooBigSomehow();
strcpy(s1 + l1, s2);
Используйте strncat(char * restrict s1, const char * restrict s2, size_t n)
Обратите внимание, что n
здесь , а не N
: размер доступен для s1
.
Функция strncat
добавляет не более n
символов (нулевой символ и символы, следующие за ним, не добавляются) из массива, на который указывает s2
, до конца строки, на которую указываетs1
.Начальный символ s2
заменяет нулевой символ в конце s1
.Завершающий нулевой символ всегда добавляется к результату.C11 §7.23.3.2 2
size_t l1 = strlen(s1);
assert(l1 < N); // This really should be true already.
strncat(s1, s2, N - 1 - l1);
// or faster
strncat(s1 + l1, s2, N - 1 - l1);
К сожалению, нет четкого указания на то, что было недостаточно места, но, по крайней мере, переполнения нет, а s1
- нулевой символ.