strcpy 和 strcat 函数及其变种 strlcpy 与 strlcat 函数

头文件

#include 

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 系列函数

你可能感兴趣的:(strcpy 和 strcat 函数及其变种 strlcpy 与 strlcat 函数)