strcat, strcat_s
来自 cppreference.cn
定义于头文件 <string.h> |
||
(1) | ||
char *strcat( char *dest, const char *src ); |
(直到 C99) | |
char *strcat( char *restrict dest, const char *restrict src ); |
(自 C99) | |
errno_t strcat_s(char *restrict dest, rsize_t destsz, const char *restrict src); |
(2) | (自 C11) |
1) 将
src
指向的空终止字节字符串的副本追加到 dest
指向的空终止字节字符串的末尾。字符 src[0]
替换 dest
末尾的空终止符。结果字节字符串为空终止的。 如果目标数组不够大,无法容纳
src
和 dest
的内容以及终止空字符,则行为未定义。如果字符串重叠,则行为未定义。如果 dest
或 src
不是指向空终止字节字符串的指针,则行为未定义。2) 与 (1) 相同,但它可能会用未指定的值覆盖目标数组的其余部分(从写入的最后一个字符到
destsz
),并且在运行时检测到以下错误并调用当前安装的 约束处理函数-
src
或dest
是空指针 -
destsz
为零或大于 RSIZE_MAX - 在
dest
的前destsz
个字节中没有空终止符 - 将会发生截断(
dest
末尾的可用空间不足以容纳src
的每个字符,包括空终止符) - 源字符串和目标字符串之间会发生重叠
-
如果
dest
指向的字符数组的大小 < strlen(dest)+strlen(src)+1 <= destsz
,则行为未定义;换句话说,destsz
的错误值不会暴露即将发生的缓冲区溢出。- 与所有边界检查函数一样,只有当实现定义了 __STDC_LIB_EXT1__ 并且用户在包含 <string.h> 之前将 __STDC_WANT_LIB_EXT1__ 定义为整数常量 1 时,才能保证
strcat_s
可用。
目录 |
[编辑] 参数
dest | - | 指向要追加到的空终止字节字符串的指针 |
src | - | 指向要复制的空终止字节字符串的指针 |
destsz | - | 要写入的最大字符数,通常是目标缓冲区的大小 |
[编辑] 返回值
1) 返回
dest
的副本2) 成功时返回零,错误时返回非零值。此外,在错误时,将零写入 dest[0] (除非
dest
是空指针或 destsz
为零或大于 RSIZE_MAX)。[编辑] 注意
由于 strcat
需要在每次调用时查找 dest
的末尾,因此使用 strcat
将多个字符串连接成一个字符串效率低下。
strcat_s
允许覆盖从最后一个写入字符到 destsz
的目标数组,以提高效率:它可以复制多字节块,然后检查空字节。
函数 strcat_s
类似于 BSD 函数 strlcat
,除了
-
strlcat
截断源字符串以适应目标字符串 -
strlcat
不执行strcat_s
执行的所有运行时检查 -
strlcat
不会通过将目标设置为空字符串或在调用失败时调用处理程序来使失败变得明显。
虽然 strcat_s
由于潜在的安全风险而禁止截断,但可以使用边界检查的 strncat_s 来截断字符串。
[编辑] 示例
运行此代码
#define __STDC_WANT_LIB_EXT1__ 1 #include <string.h> #include <stdio.h> #include <stdlib.h> int main(void) { char str[50] = "Hello "; char str2[50] = "World!"; strcat(str, str2); strcat(str, " ..."); strcat(str, " Goodbye World!"); puts(str); #ifdef __STDC_LIB_EXT1__ set_constraint_handler_s(ignore_handler_s); int r = strcat_s(str, sizeof str, " ... "); printf("str = \"%s\", r = %d\n", str, r); r = strcat_s(str, sizeof str, " and this is too much"); printf("str = \"%s\", r = %d\n", str, r); #endif }
可能的输出
Hello World! ... Goodbye World! str = "Hello World! ... Goodbye World! ... ", r = 0 str = "", r = 22
[编辑] 参考文献
- C11 标准 (ISO/IEC 9899:2011)
- 7.24.3.1 strcat 函数 (p: 364)
- K.3.7.2.1 strcat_s 函数 (p: 617-618)