我想在目的地附加一个字符串文本。我可以使用strcat
或strncat
:
strcat(dest, "values");
或者
strncat(dest, "values", sizeof("values") - 1);
strcat
代码更短,看起来很整洁。但我想知道它们的运行时性能。
因为不需要定位终止符,所以在运行时
strncat
会稍微快一点吗?或者编译器可以进行优化,所以没有区别?
最佳答案
首先,对于空终止符strcat
和strncat
loks,区别在于strncat
还检查复制数据的大小,并且只复制n
字节。
其次,由于strcat
不检查复制的数据的大小,并且在它到达空终止符之前进行复制,所以它可能(而且将会!)!!)导致缓冲区溢出,覆盖复制到的缓冲区之后存储在内存中的数据。
第三,使用strncat并不安全,因为您将拷贝限制在源缓冲区的大小,而不是目标缓冲区的大小。例如,要正确使用它,您应该传递目标缓冲区的大小:
strncat(dest, "values", sizeof(dest) -1 );
第四,如果源字符串的大小大于目标字符串的
n
,则不会追加空终止符,因此在调用strncat
之后,您应该自己添加它:strncat(dest, "values", sizeof(dest) -1 );
dest[sizeof(dest) - 1] = '\0';
最后一件事,因为这是strncat,它复制到目标字符串终止的任何地方,所以大小计算稍微复杂一些,实际上是:
strncat(dest, "values", total_size_of_dest_buffer - strlen(dest) - 1 );