strncat()总是null终止吗?

时间:2017-01-14 16:12:25

标签: c arrays string strcat

考虑此代码:

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

如果str2长度大于limit,则strncat Nul会终止str1,或者我必须添加此代码,例如strncpy

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

2 个答案:

答案 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;

如果满足此条件,则终止结果为空,否则为空。**