2017-01-14 7 views
4

Учитывая этот код:Действительно ли strncat() всегда заканчивается?

limit = sizeof(str1)-strlen(str1)-1; 
strncat(str1,str2,limit); 

Если str2 длина больше, чем limit, делает strncat Нуль завершает str1 или я должен добавить этот код, как и в случае strncpy?

str1[sizeof(str1)-1] = '\0' 
+0

Вы уверены, что 'str1' имеет тип массива, правильно? –

+0

неправ, неполный. Вы __had__, чтобы упомянуть, что 'str1' - это массив. –

+0

Как объявляется 'str1'? Мы можем догадаться, но имейте в виду, что кто-то, кто не знаком с возможными проблемами, будет использовать ваш код и ... получить проблемы. Как бы то ни было, ваш код не сработает (возможно, эффектно), если 'str1' является символом' char * '. – usr2564301

ответ

5

Это всегда null-terminate.

Цитирование C11, глава §7.24.3.2, (курсив мой )

strncat функция присоединяет не более n символов (нулевой символ и символы, которые следуют за ней не прилагается) из массива, на который указывает s2, до конца строка, на которую указывает s1. Начальный символ s2 перезаписывает нулевой символ на конце s1. Конечный нулевой символ всегда добавляется к результату.

и сноска

Таким образом, максимальное количество символов, которые могут в конечном итоге в массиве, на который указывает s1 является strlen(s1)+n+1.