必威体育Betway必威体育官网
当前位置:首页 > IT技术

C4996:'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead.

时间:2019-09-02 08:41:04来源:IT技术作者:seo实验室小编阅读:79次「手机版」
 

strcpy

使用C语言中字符串的处理函数提示错误

*需包含头文件"string.h"

#include "string.h"

strcpy函数为例

原型:strcpy(str1, str2);

功能:将字符串str2赋值到字符串str1中。可以用来为字符串赋值

注意:1)会把str1原始字符串全部覆盖;2)str2的长度不能超过str1定义的长度

char str1[]="We are csdn!";
char str2[]="Hello!";

strcpy(str1,str2);
printf("str1 = %s\n",str1);
//结果:str1 = Hello!

vs2017中,如果直接这样写会提示如下错误:

原因解释:

这种微软的警告,主要因为那些C库的函数,很多函数内部是不进行参数检测的(包括越界类的),微软担心使用这些会造成内存异常,所以就改写了同样功能的函数,改写了的函数进行了参数的检测,使用这些新的函数会更安全和便捷。关于这些改写的函数你不用专门去记忆,因为编译器对于每个函数在给出警告时,都会告诉你相应的安全函数,查看警告信息就可以获知,在使用时也再查看一下MSDN详细了解。

处理方法:

1)项目属性->C/C++->预处理器->预处理器定义中添加:_CRT_SECURE_NO_WARNINGS

2)使用提示的strcpy_s代替strcpy

现在我们来检验一下注意当中的第二条:str2的长度不能超过str1定义的长度

我们改变一下代码,让str2的长度大于str1的长度,同时采用处理方法中的第一条,还是使用strcpy函数:

char str1[] = "We are csdn!";
char str2[] = "Hello we are csdn!";

strcpy(str1, str2);
printf("str1 = %s\n", str1);
//结果:str1 = Hello we are csdn!

我们得到了正确结果:

现在我们不采用第一种处理方法,而采用第二种处理方式,使用strcpy_s函数代替strcpy函数:

char str1[] = "We are csdn!";
char str2[] = "Hello we are csdn!";

strcpy_s(str1, str2);
printf("str1 = %s\n", str1);
//结果:str1 = Hello we are csdn!

运行后提示如下错误:

这个错误就是字符组数组越界了,这是因为strcpy_s函数检测了str1的长度是否大于str2的长度,发现并不满足str1的长度大于str2的长度,所以提示错误,然而strcpy函数却没有这种检测,所以得出了正确结果,但这是极其危险的,因为这种方式修改了没有在定义中的内存,会恶意改写没有经过系统分配的内存。

所以不管使用哪种处理方式,我们都应该注意字符串的长度,避免这种潜在的危险性,推荐第二种处理方式,这样会有检测,避免危险性

strcpy函数检测

char str1[] = "We are csdn!";
char str2[] = "Hello We are csdn!";

int size1 = strlen(str1);  //size1=12
int size2 = sizeof(str1);  //size2=13

strcpy(str1, str2);

int size3 = strlen(str1);  //size3=18
int size4 = sizeof(str1);  //size4=13

从中也可以发现strlen函数与sizeof函数的区别,strlen函数计算字符串的长度,但不包括字符'\0',但sizeof函数计算整个这个字符串数组占内存的大小,包括字符'\0';在把字符串str2复制到str1中后,字符串的长度已经超过了字符串数组的长度了,这是危险的,但我们发现这时字符串的长度以改变,但字符串数组的大小并没有改变

相关阅读

using(){}

using( 实例化对象 ){对象使用的语句}使用Using语法,会自动调用Dispose()方法。--> 释放资源写法如同:类 对象 = new 类();对象.方法

strcpy函数的使用

//strcpy函数的使用 #include<iostream> using namespace std; int main(){ char a[7] = "abcdef"; //不能写成char a[6] = "ab

PHP 警告 Warning: Unknown: Input variables exceede

警告全文是这样的:Warning: Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini.

jedis : NoSuchMethodError: org.springframework.uti

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'connectionFactory' defined in c

“Uncaught TypeError: $(...).dataTable is not a fu

      “Uncaught TypeError: $(...).dataTable is not a function” 转载:https://www.tpyyes.com/a/js_css/2018/0718/680.

分享到:

栏目导航

推荐阅读

热门阅读