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
指向的以 null 结尾的字节字符串的副本附加到 dest
指向的以 null 结尾的字节字符串的末尾。字符 src[0]
替换 dest
末尾的 null 终止符。结果字节字符串以 null 结尾。 如果目标数组不足以容纳
src
和 dest
的内容以及终止 null 字符,则行为是未定义的。如果字符串重叠,则行为是未定义的。如果 dest
或 src
都不是指向以 null 结尾的字节字符串的指针,则行为是未定义的。2) 与 (1) 相同,但它可能会用未指定的值破坏目标数组的其余部分(从最后一个写入的字符到
destsz
),并且以下错误会在运行时检测到并调用当前安装的 约束处理程序 函数- `src` 或 `dest` 是空指针
-
destsz
为零或大于 RSIZE_MAX dest
的前destsz
字节中没有 null 终止符- 会发生截断(
dest
末尾的可用空间不足以容纳src
的每个字符,包括 null 终止符) - 源字符串和目标字符串之间会发生重叠
如果
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
破坏目标数组,以提高效率:它可能以多字节块复制,然后检查 null 字节。
函数 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)