c - 字符串文字的 strcat 与 strncat

标签 c string compiler-construction concatenation

我想将字符串文字附加到目标。我可以使用 strcatstrncat:

strcat(dest, "values");

或者

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

strcat 代码更短,看起来更整洁。

但我想知道它们的运行时性能。

strncat 是否因为不需要定位终止符而在运行时稍微快一些?

或者也许编译器可以进行优化,所以没有区别?

最佳答案

首先,strcatstrncat 都查找空终止符,区别在于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/

相关文章:

c - 使用strcpy时出现段错误?

c - C 中返回多个二维数组位置的函数不起作用

C基数排序字符串数组

javascript - 如何正确显示字符串中的项目符号点?

c++ - 使用 nVIDIA 编译器生成共享库供我的 GNU 编译器链接时出现运行时错误

javascript - 使用 Cakefile 编译 CoffeeScript

java - 为什么叫动态绑定(bind)而不是静态绑定(bind)呢?

c - DECLARE_PER_CPU 变量存储在内核中的什么位置

c - 如何在运行时获取数据和bss地址空间(在Unix C程序中)

python-3.x - 如何从Python中的字符串创建日期时间索引?