首页 > 编程知识 正文

strcpy strncpy,strcat和strncat

时间:2023-05-06 02:08:44 阅读:265420 作者:2468

调查报告:整理并用实验比较分析strncpy、strcpy_s、 strncpy_s、strlcpy、strncat、strcat_s、 strncat_s、 strlcat等函数的异同

包含在头文件 string .h 中。

Strncpy: 函数原型:char *strncpy( char *dest, const char *src, std::size_t count );
比较:strcpy 的可以添加参数,表示复制 n 个字符,而不是像 strcpy 寻找””把所有字符拷贝。特别的,若 n 大于待复制的字符串,‘’填充至 n 个。参数来源为用户输入,故安全性不好。(相对 strcpy 较安全)并且注意,如果 src 的前 n 个字节不含 NULL 字符,则结果不会以 NULL 字符结束。

Strlcpy:
原型:strlcpy(char *dst, const char *src, size_t siz);
比较:类似 strncpy,但是,使用 strlcpy,就不需要我们去手动负责 了,仅需要把 sizeof(dst) 告之 strlcpy 特别的,strlcpy 并不属于 ANSI C,至今也还不是标准。

strcpy_s:
函数原型:
errno_t __cdecl strcpy_s(char*_Destination,rsize_t _SizeInBytes,char const* _Source); strlcpy
功能比较:复制字符串_Source 中的字符到字符串_Destination,其中限制了大小为 _SizeInBytes,这是为了防止字符串过长超出缓存区内存引发问题而要求的。

Strncpy _s: 原型:errno_t strncpy_s(char * restrict dest,rsize_t destsz,const char * restrict src,rsize_t count);
参数说明:
Dest:指向要复制到的字符数组的指针 SRC:指向要复制的字符数组的指针 count 最大数量的字符复制 destsz 目标缓冲区的大小特别的,加_s 版本则是从 VS2005 开始推出的安全版本。
相对安全,在接口增加了一个参数 numElems 来表明 dest 中的字节数,比较:正如后 C11 DR 468 所纠正的那样,strncpy_s 与 strcpy_s 不同,只有在发生错误时才允许对目标数组的其余部分进行截断。
与 strncpy 不同,strncpy_s 不会用零填充目标数组,这是将现有代码转换为边界检查版本时常见的错误来源。
尽管适合目标缓冲区的截断存在安全风险,并因此违反了 strncpy_s 的运行时间约束,但可以通过指定 count 等于目标数组的大小减 1 来获得截断行为:它将复制第一个计数字节和像往常一样追加空终止符:strncpy_s(dst,sizeof dst,src,(sizeof dst)-1);

Strncat:
函数原型:char * strncat(char * dest,const char * src,size_t count);
特性:1)追加由 src 指向的字符数组中的大多数计数字符,如果找到空字符,则停止到由 dest 指向的以 null 结尾的字节字符串的末尾。 字符 src [0]替换 dest 结尾处的空终止符。 终止空字符总是附加在最后(因此函数可以写入的最大字节数为 count + 1)。
2)与(1)相同,只是此函数可能会打断目标数组的其余部分(从写入到 destsz 的最后一个
字节开始),并且在运行时检测到以下错误并调用当前安装的约束处理函数: src 或者 dest 是空指针
destsz 或者 count 是零或大于 RSIZE_MAX 在第一个 destsz 字节中没有空字符 dest 则会发生截断:count 或者 src 较小者的长度超过了 dest 和 destsz 的空终止符之间的可用空间。
源和目标字符串之间会发生重叠

比较:尽管适合目标缓冲区的截断存在安全风险,并且因此违反了 strncat_s 的运行时间约束,但可以通过指定 count 等于目标数组的大小减 1 来获得截断行为:它将复制第一个计数字节和 像往常一样添加空终止符:strncat_s(dst,sizeof dst,src,(sizeof dst)-strnlen_s
(dst,sizeof dst)-1);

strcat_s:
函数原型:errno_t strcat_s(char * restrict dest,rsize_t destsz,const char * restrict src);
(C11)比较:为了提高效率,strcat_s 允许从最后写入 destsz 的字符中截断目标数组:它可以复制多字节块,然后检查空字节。

strncat_s:函数原型:errno_t strncat_s(char * restrict dest,rsize_t destsz,const char * restrict src, rsize_t count);

参数说明:
Dest 指向要附加到的以空字符结尾的字节字符串
SRC 指向要复制的字符数组的指针
Count 最大数量的字符复制
Destsz 目标缓冲区的大小
比较:如果由 dest <strnlen(dest,destsz)+ strnlen(src,count)+1 <destsz;指向的字符数组的大小,行为是不确定的。 换句话说,destsz 的错误值不会暴露即将发生的缓冲区溢出。 如果字符数组的大小由 src <strnlen(src,count)<destsz; 换句话说,count 的错误值不会暴露即将发生的缓冲区溢出。 作为所有边界检查函数,只有当__STDC_LIB_EXT1__由实现定义并且在包含 string.h 之前用户将__STDC_WANT_LIB_EXT1__定义为整数常量 1 时, strncat_s 才能保证可用。

strlcat:
函数原型:
size_t strlcat(char *dest, const char *src, size_t destsz);

比较:函数 strcat_s 与 BSD 函数 strlcat 相似,除以下情况: strlcat 截断源字符串以适合目标 strlcat 不执行所有的运行时检查是 strcat_s 不会 strlcat 通过将目标设置为空字符串或在调用失败时调用处理程序不会使失败变得明显。
虽然 strcat_s 由于潜在的安全风险而禁止截断,但可以使用 bounds-checked strncat_s 来截断字符串。

原文链接 https://blog.csdn.net/ALPS233/article/details/102736487
参考:C++ Reference,C 中文开发手册等

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。