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

头文件

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一次LINUX网络协议栈的探根之旅 公司的公共库中发现一段代码,简单化之,如下 我们知道sockaddr和sock...
    yiltoncent阅读 6,689评论 0 3
  • iOS面试小贴士 ———————————————回答好下面的足够了------------------------...
    不言不爱阅读 6,466评论 0 7
  • 史上最全的iOS面试题及答案 iOS面试小贴士———————————————回答好下面的足够了----------...
    Style_伟阅读 7,156评论 0 35
  • ———————————————回答好下面的足够了---------------------------------...
    恒爱DE问候阅读 5,734评论 0 4
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 8,770评论 0 6

友情链接更多精彩内容