strcat, strcat_s
来自 cppreference.com
定义在头文件 <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)