使用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=13strcpy(str1, str2);int size3 = strlen(str1);  //size3=18
int size4 = sizeof(str1);  //size4=13

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

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

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

            使用VS2005以上版本(VS2005.VS2008.VS2010)编译在其他编译器下正常通过的C语言程序,你可能会遇到类似如下的警告提示:  引用内容       warning C ...

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

            今天编写C++程序在使用头文件#include<cstring>中的strcpy()和strcat()函数时出现了一个错误:error C4996: 'strcpy': T ...

  3. 解决VS2017中出现'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead这问题

    当运行C++程序时,出现下面错误: 1>------ Build started: Project: Windows 编程, Configuration: Debug Win32 ------ ...

  4. error C4996: ‘strcpy‘: This function or variable may be unsafe. Consider using strcpy_s instead.

    Hello,everyone! 我是鲁班·,一个热衷于科研和软开的胖子! 出现这个错误时,是因为strcpy函数不安全造成的溢出. 解决方法是:找到[项目属性],点击[C++]里的[预处理器],对[预 ...

  5. Visual Stdio2013 编译错误【error C4996:'scanf':This function or variable may be unsafe.】最简单的解决方法

    (请先看置顶博文)https://blog.csdn.net/GenuineMonster/article/details/104495419 在Visual Studio 2013中编译 C 语言项 ...

  6. VC2019编译报错 error C4996: This function or variable may be unsafe

    [问题描述] 使用新安装的VS2019编译C代码保报错error C4996: 'sprintf': This function or variable may be unsafe. Consider ...

  7. VS编译器提示:C4996 ‘scanf‘: This function or variable may be unsafe. Consider using scanf_s instead.的解决方法

    博主在使用VS2019编译器运行c代码时控制台提示:错误 C4996 'scanf': This function or variable may be unsafe. Consider using ...

  8. 【C++】错误 C4996 ‘localtime‘:This function or variable may be unsafe.

    char ch[64]; strftime(ch, sizeof(ch), "%Y-%m-%d-%H-%M-%S", localtime(&t)); //年-月-日 时-分 ...

  9. 【我的C语言学习进阶之旅】解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.

    一.问题描述 今天在Visual Studio 2019中写一段C语言的代码,发生生成错误.弹框如下: 点击[否(N)],提示如下: 错误具体信息为: 错误 C4996 'fscanf': This ...

最新文章

  1. oracle-SYSTEM表空间的备份与恢复
  2. PHP base64数据与图片的互相转换
  3. php如何检测键盘按键,js键盘事件,判断按下的是哪个键
  4. 【Dart学习】-- Dart之泛型
  5. python自动登录qq空间_python 利用splinter组件,自动登录QQ空间
  6. 10种进阶方法让你快速测试端口连通性
  7. 再看中国互联网web2.0百强名单
  8. macOS Monterey 12.0 Beta版 With Clover 5136 and OC 0.7.0 and PE 三EFI分区原版黑苹果镜像
  9. 0x8000FFFF(0X8000FFFF,WPS)
  10. U盘装机大师安装GHOST WIN10系统
  11. STM32CubeIDE的一点使用技巧
  12. 音乐外链生成php,如何使用php生成短链接网址 第三方API
  13. 理解类8583报文协议
  14. java国际化转换_java 实现国际化 中英文语言切换
  15. C++实现输出一个集合的全部子集
  16. 入行大数据,需要学习哪些基础知识?
  17. W7系统如何增大C盘空间(动态磁盘)
  18. 赚钱的方式,很有道理!!!!
  19. 高数 01.06极限存在准则
  20. 哈工大《微积分》——一元积分学与微分方程

热门文章

  1. 【Java】Java实现找图抓色
  2. 傅里叶级数、傅里叶变换、短时傅里叶变换 公式
  3. idea怎么看jdk版本_怎么看自己的jdk版本
  4. SHA224和SHA256哈希算法原理及实现(附源码)
  5. 转发(Forward)和重定向(Redirect)的区别
  6. OSChina 周三乱弹 —— 生活终于对我这只小猫咪动手啦
  7. List.toArray
  8. 纽约大学计算机和信息科学专业排名,纽约大学计算机科学与信息系统世界排名2021年最新排名第21(QS世界排名)...
  9. SpringBoot_liquibase使用
  10. TCP接收窗口--确定Window