头文件
#include <string.h>
1. strcpy 系列函数
定义
// strcpy
char *strcpy( char *dest, const char *src ); // (until C99)
char *strcpy( char *restrict dest, const char *restrict src ); // (since C99)
errno_t strcpy_s(char *restrict dest, rsize_t destsz, const char *restrict src);// (since C11)
// strncpy
char *strncpy( char *dest, const char *src, size_t count ); // (until C99)
char *strncpy( char *restrict dest, const char *restrict src, size_t count ); // (since C99)
errno_t strncpy_s(char *restrict dest, rsize_t destsz,
const char *restrict src, rsize_t count); // (since C11)
// strlcpy
size_t strlcpy(char *dest, const char *src, size_t destsz); // 非ANSI C 标准,glibc 包含
返回值
- 返回
char *
的为返回指向 copy 后目标空间的首地址 - 返回
errno_t
的为返回函数执行错误码,为0
则成功,非零为对应错误码 - 返回
size_t
的为返回最终写入到dest
中的长度
说明
-
strcpy
函数是依据\0
作为结束判断的,如果dest
的空间不够,则会引起 buffer overflow。 -
strncpy
函数是在ANSI C
中,strcpy
的安全版本。size_t count
的大小代表要从src
中 copy 的 char 个数。这个函数最常见的问题是:其不保证 copy 后的dest
以\0
结束。 -
strlcpy
函数的作用就是strncpy
的加强版,但其并不是ANSI C
的标准函数。strlcpy
来源于 OpenBSD 2.4,之后很多 unix-like 系统的 libc 中都加入了 strlcpy 函数,我个人在 FreeBSD、Linux 里面都找到了strlcpy
。(Linux使用的是 glibc,glibc里面有 strlcpy,则所有的Linux版本也都应该有 strlcpy);但 Windows 下是没有 strlcpy 的,对应的是strcpy_s
函数。 -
strcpy_s
函数时C11
引入的相对安全的写法,第二个参数destsz
表示dest
中的空间大小,防止目标指针dest
空间不足而导致bug,同时返回值改成返回错误代码。 -
strncpy_s
函数和strcpy_s
一样,添加了一个目标空间大小destsz
。 - 当目标字符串的长度比源字符串明显大很多的时候,程序员正在避免使用 strncpy ,主要由于其降低性能。如,
sizeof(dest) = 100; sizeof(src) = 10; count = sizeof(dest)
时,此函数仍会将第 10个及以后的字符全都跑一边置为\0
。
2. strcat 系列函数
定义
// strcat
char *strcat( char *dest, const char *src ); // (until C99)
char *strcat( char *restrict dest, const char *restrict src ); // (since C99)
errno_t strcat_s(char *restrict dest, rsize_t destsz, const char *restrict src);// (since C11)
// strncat
char *strncat( char *dest, const char *src, size_t count ); // (until C99)
char *strncat( char *restrict dest, const char *restrict src, size_t count ); // (since C99)
errno_t strncat_s(char *restrict dest, rsize_t destsz,
const char *restrict src, rsize_t count); // (since C11)
// strlcat
size_t strlcat(char *dest, const char *src, size_t destsz);
返回值
同 strcpy
系列函数
说明
同 strcpy
系列函数
网友评论