例子:
#include<iostream>
#include<cstring>
using namespace std;void Test(void)
{
char *str1=NULL;
str1=new char[20];
char str[7];
strcpy_s(str1,20,"hello world");//三个参数
strcpy_s(str,"hello");//两个参数但如果:char *str=new char[7];会出错:提示不支持两个参数
cout<<"strlen(str1):"<<strlen(str1)<<endl<<"strlen(str):"<<strlen(str)<<endl;
printf(str1);
printf("\n");
cout<<str<<endl;
}int main()
{
Test();
return 0;
}
#include<iostream> #include<string.h> using namespace std;
void Test(void) { char *str1=NULL; str1=new char[20]; char str[7]; strcpy_s(str1,20,"hello world");//三个参数 strcpy_s(str,"hello");//两个参数但如果:char *str=new char[7];会出错:提示不支持两个参数 cout<<"strlen(str1):"<<strlen(str1)<<endl<<"strlen(str):"<<strlen(str)<<endl; printf(str1); printf("\n"); cout<<str<<endl; }
int main() { Test(); return 0; }
输出为:
strlen(str1): 11        //另外要注意:strlen(str1)是计算字符串的长度,不包括字符串末尾的“\0”!!!
strlen(str): 5
hello world
hello

strcpy_s和strcpy()函数的功能几乎是一样的。strcpy函数,就象gets函数一样,它没有方法来保证有效的缓冲区尺寸,所以它只能假定缓冲足够大来容纳要拷贝的字符串。在程序运行时,这将导致不可预料的行为。用strcpy_s就可以避免这些不可预料的行为。
这个函数用两个参数、三个参数都可以,只要可以保证缓冲区大小。
三个参数时:
errno_t strcpy_s(
char *strDestination,
size_t numberOfElements,
const char *strSource

);

strDestination
位置的位置字符串缓冲区
numberOfElements
目标字符串缓冲区的大小。
strSource
null 终止的源字符串缓冲区.

两个参数时:
errno_t strcpy_s(
char (&strDestination)[size],
const char *strSource
); // C++ only

在debug版本中使用strcpy_s时,将源字符串拷贝到目标buffer后,会在结束符(‘\0’)后自动使用0xFD填充目标buffer后面的剩余空间。如果不想编译器多管闲事,可以在调用strcpy_s前调用_CrtSetDebugFillThreshold(0);

strcpy_s是系统的安全函数,微软在2005后建议用一系统所谓安全的函数,这中间就有strcpy_s取代了strcpy,原来strcpy函数,就象gets函数一样,它没有方法来保证有效的缓冲区尺寸,所以它只能假定缓冲足够大来容纳要拷贝的字符串。

一下是使用strcpy_s与strcpy的安全性比较

char szBuf[2] = {0};
 strcpy_s(szBuf, 2, "12131");  //新的CRT函数
 strcpy(szBuf,  "12131");    //老的CRT函数

上述代码,明显有缓冲区溢出的问题。 使用strcpy_s函数则会抛出一个异常。而使用strcpy函数的结果则未定,因为它错误地改变了程序中其他部分的内存的数据,可能不会抛出异常但导致程序数据错误,也可能由于非法内存访问抛出异常。

使用新的增强安全的CRT函数有什么好处呢?简单地说,新的函数加强了对参数合法性的检查以及缓冲区边界的检查,如果发现错误,会返回errno或抛出异常。老版本的这些CRT函数则没有那么严格的检查与校验,如果错误地传输了参数或者缓冲区溢出,那么错误并不能被立刻发现,对于定位程序错误也带来更大困难。

strcpy_s与strcpy相关推荐

  1. strcpy_s与strcpy的比較

    strcpy_s和strcpy()函数的功能差点儿是一样的.strcpy函数,就象gets函数一样,它没有方法来保证有效的缓冲区尺寸,所以它仅仅能假定缓冲足够大来容纳要拷贝的字符串.在程序执行时,这将 ...

  2. strcpy_s与strcpy对照

    strcpy_s和strcpy()函数功能几乎相同.strcpy函数.就象gets函数一样,它没有方法来保证有效的缓冲区尺寸.所以它仅仅能假定缓冲足够大来容纳要拷贝的字符串.在程序执行时,这将导致不可 ...

  3. 重温C++之“strcpy_s与strcpy的比较”

    strcpy_s和strcpy()函数的功能几乎是一样的.strcpy函数,就象gets函数一样,它没有方法来保证有效的缓冲区尺寸,所以它只能假定缓冲足够大来容纳要拷贝的字符串.在程序运行时,这将导致 ...

  4. strcpy、wcscpy与_tcscpy关系 strcpy_s与strcpy比较

    C++标准库函数提供了字符和字符串的操作函数,并提供了其UNICODE版本,如: char *strcpy(char *strDestination, const char *strSource); ...

  5. strcpy_s函数/strcpy函数简介

    strcpy /* *描述:此类函数是用于对字符串进行复制(拷贝). * *参数: * [in] strSource:需要拷贝的字符串 * [out] strDestination:拷贝完成之后的字符 ...

  6. C语言 strcpy 和 strcpy_s 函数区别 - C语言零基础入门教程

    目录 一.strcpy_s 函数/strcpy 函数简介 1.strcpy 函数语法 2.strcpy_s 函数语法 二.strcpy/strcpy_s 函数实战 三.猜你喜欢 零基础 C/C++ 学 ...

  7. strcpy、strcpy_s、strncpy、strncpy_s 字符串拷贝用法

    1.strcpy 原型声明: char *strcpy(char* dest, const char *src); 功能:将以src为首地址的字符串复制到以dst为首地址的字符串,包括'\0'结束符, ...

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

    使用C语言中字符串的处理函数提示错误 *需包含头文件"string.h" #include "string.h" 以strcpy函数为例 原型:strcpy(s ...

  9. strcpy()、strncpy()和strcpy_s()函数的区别

    1.strcpy()函数 原型声明:char *strcpy(char* dest, const char *src); 头文件:#include <string.h> 和 #includ ...

最新文章

  1. TCP通信速率与延时关系
  2. 5添加一块盘_win系统,Linux系统,重装系统后,添加盘简易教程
  3. fiddler设置中文版本_教你下载iOS老版本应用
  4. ebook_[EBOOK]十大Java性能问题
  5. FFMPEG的详细资料可以在它的官方网站上找到
  6. x86 Assembly Guide
  7. linux代替ps的软件,Photoshop的开源替代品 图像编辑器GIMP迎来25岁生日
  8. word java api_Java中的Word文档创建API
  9. PulseAudio 模块化实现录音和放音
  10. nfs挂载文件系统时VFS: Unable to mount root fs on unknown-block的问题解决
  11. 常见的SSL证书错误代码及解决方法
  12. JVM 性能调整的一些基本概念
  13. Camera-3A AE/AWB/AF
  14. LINUX最常见命令
  15. html怎么去除照片背景颜色,photoshop怎么去除图片背景色
  16. 2011-09-06 [plus_format_fck.js代码]
  17. 重来之大学版|卸负篇-对自己大学很失望怎么办?觉得自己大学很不好怎么办?刚到大学不适应怎么办?
  18. 力扣的组合总和解法 (Python)
  19. 用计算机绘制函数图像ppt,ppt中怎么绘制三角函数图像?
  20. 搜索引擎优化排名方法

热门文章

  1. Nature新子刊创刊首发综述论文:这是你常听到的贝叶斯统计与建模
  2. 深度解决 SecurityException: User has not given permission to device UsbDevice
  3. 用Pytorch实现RGB2LAB,LAB2RGB。
  4. NB-IoT的上行SC-FDMA与下行OFDMA的matlab误码率仿真
  5. 设备驱动中的并发控制
  6. 国际性PRO-SID研究开始招募患者,该研究评估Panzyga(R)用于慢性淋巴细胞白血病和继发性免疫缺陷患者的一级预防性治疗
  7. Win7不激活会怎么样 Win7可以不用激活吗
  8. 如何给字符串数组赋值
  9. 电脑文件丢失了怎么恢复?2021最新教程汇总
  10. 普通数字到科学计数法的转换