strcpy复制‘\0‘

strcpy复制‘\0‘今天发现了这样一个问题: char*arr=newchar[10]; strcpy(arr,"wangzhaaaa"); delete[]arr;执行这段代码将会报错,因为strcpy复制char*时会复制’\0’,所有在new字符数组的时候应该预留’\0’的空间,否则到时候delete的时候会报错!代码改成这样即可 char*arr=newchar[11………

前言

先说一下结论:

strcpy会复制’\0’,所以在使用该函数的时候要预留结束符的空间

在本文最后,有strcpy的替代方案

问题

今天发现了这样一个问题:

	char *arr = new char[10];
	strcpy(arr, "wangzhaaaa");
	delete []arr;

执行这段代码将会报错,因为strcpy复制char*时会复制’\0’,所有在new 字符数组的时候应该预留’\0’的空间,否则在使用该字符串的时候可能会产生灾难性后果!代码应该改成这样

	char *arr = new char[11];
	strcpy(arr, "wangzhaaaa");
	delete []arr;

这是个比较严重的问题!

解决方案

1、使用strcpy_s函数替代strcpy,这种情况下如果出现缓冲区溢出的问题,strcpy_s内部就会直接抛出异常,而不会像strcpy一样,产生一些隐晦的幽灵Bug。但strcpy_s仅仅只是会提前报错而已,个人感觉还是不好用。

在Windows下更佳的解决方案:

2、使用StringCchCopyA替代strcpy,即便源字符串的缓存区大于目标缓冲区,函数依然能正常工作,看以下代码即可:

#include <strsafe.h>

int main()
{
	char *arr = new char[5];
	StringCchCopyA(arr, 5, "abcdefgh");
	printf("%s\n", arr);
	delete[] arr;
	system("pause");
}

‘">strcpy复制‘<img decoding=‘">

 

StringCchCopyA在复制时,如果超出了缓冲区,将会截断字符串,并在末尾添加结束符’\0’,这就比较完美了 ,需要注意的是该函数的第二个参数是字符长度而非字节数,在使用窄字节的时候无所谓,毕竟空间长度等于字节数,但在使用宽字节的时候要尤其注意,切记填空间长度而非字节数!

 StringCchCopy第二个参数填目标字符串长度时需要算上结束符 ‘\0’所占用的1个字符长度

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/35357.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注