考虑此代码:
limit = sizeof(str1)-strlen(str1)-1;
strncat(str1,str2,limit);
如果str2
长度大于limit
,则strncat
Nul会终止str1
,或者我必须添加此代码,例如strncpy
?
str1[sizeof(str1)-1] = '\0'
答案 0 :(得分:6)
它始终为空终止。
引用C11
,章节§7.24.3.2,(强调我的)
strncat
功能附加不超过n
个字符(空字符和 从s2
指向的数组到结尾的跟随它的字符不会被附加s1
指向的字符串。s2
的初始字符将覆盖空字符 结束s1
。 终止空字符始终附加到结果中。
和脚注
因此,
s1
指向的数组中可以结束的最大字符数是strlen(s1)+n+1
。
答案 1 :(得分:-1)
低于C11的C ++版本不会在情况下附加空字符,例如当源字符串内部没有足够的空间容纳目标字符串时。
char str[5];
str="Ami"
char str2[10];
str2="NotGoing"
str有2个可用空间,但需要7个空间来连接str2和1个空字符。 strncat(str,str2,); //没有空终止的情况。
现在,如果str没有足够的空间将整个目标(str2)以及str的预写数据写入其中,那么在这种情况下,它将不会在末尾添加空字符
char str[10];
str="Ami"
char str2[3];
str2="Hello"
str里面有足够的空间用于str2。因此将在末尾添加一个空字符。
strncat(str,str2,);// case with null termination.
我要亲自检查的正式
分配给str的长度> = strlen(str)+ strlen(str2)+1;
如果满足此条件,则终止结果为空,否则为空。**