我想将字符串文字附加到目标。我可以使用 strcat
或 strncat
:
strcat(dest, "values");
或者
strncat(dest, "values", sizeof("values") - 1);
strcat
代码更短,看起来更整洁。
但我想知道它们的运行时性能。
strncat
是否因为不需要定位终止符而在运行时稍微快一些?
或者也许编译器可以进行优化,所以没有区别?
最佳答案
首先,strcat
和strncat
都查找空终止符,区别在于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 );
关于c - 字符串文字的 strcat 与 strncat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24465620/