strncat()总是null终止吗?

Dem*_*rio 5 c arrays string strcat

考虑这段代码:

limit = sizeof(str1)-strlen(str1)-1;
strncat(str1,str2,limit);
Run Code Online (Sandbox Code Playgroud)

如果str2长度大于limit,strncatNul是否终止str1或者我必须添加此代码,就像在strncpy?的情况下一样?

str1[sizeof(str1)-1] = '\0'
Run Code Online (Sandbox Code Playgroud)

Sou*_*osh 6

它始终为null终止.

引用C11,章节§7.24.3.2,(强调我的)

strncat函数追加的字符数不超过n字符(空字符及其后面的字符未附加),从指向的数组到s2指向的字符串的末尾s1.最初的字符s2覆盖了结尾处的空字符s1.终止空字符始终附加到结果.

而且,脚注

因此,可以在指向的数组中结束的最大字符数s1strlen(s1)+n+1.

  • strncat 可能会令人困惑,因为“n”与源字符串相关,而不与目标缓冲区相关。所以这个函数还是不安全的,会导致溢出。大多数其他“n”变体都是为了防止溢出而创建的,这也是我过去感到困惑的原因。 (3认同)