我想在目的地附加一个字符串文本。我可以使用strcatstrncat

strcat(dest, "values");

或者
strncat(dest, "values", sizeof("values") - 1);

strcat代码更短,看起来很整洁。
但我想知道它们的运行时性能。
因为不需要定位终止符,所以在运行时strncat会稍微快一点吗?
或者编译器可以进行优化,所以没有区别?

最佳答案

首先,对于空终止符strcatstrncatloks,区别在于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 );

10-02 09:34