strcpy_s与strcpy
例子:
#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相关推荐
- strcpy_s与strcpy的比較
strcpy_s和strcpy()函数的功能差点儿是一样的.strcpy函数,就象gets函数一样,它没有方法来保证有效的缓冲区尺寸,所以它仅仅能假定缓冲足够大来容纳要拷贝的字符串.在程序执行时,这将 ...
- strcpy_s与strcpy对照
strcpy_s和strcpy()函数功能几乎相同.strcpy函数.就象gets函数一样,它没有方法来保证有效的缓冲区尺寸.所以它仅仅能假定缓冲足够大来容纳要拷贝的字符串.在程序执行时,这将导致不可 ...
- 重温C++之“strcpy_s与strcpy的比较”
strcpy_s和strcpy()函数的功能几乎是一样的.strcpy函数,就象gets函数一样,它没有方法来保证有效的缓冲区尺寸,所以它只能假定缓冲足够大来容纳要拷贝的字符串.在程序运行时,这将导致 ...
- strcpy、wcscpy与_tcscpy关系 strcpy_s与strcpy比较
C++标准库函数提供了字符和字符串的操作函数,并提供了其UNICODE版本,如: char *strcpy(char *strDestination, const char *strSource); ...
- strcpy_s函数/strcpy函数简介
strcpy /* *描述:此类函数是用于对字符串进行复制(拷贝). * *参数: * [in] strSource:需要拷贝的字符串 * [out] strDestination:拷贝完成之后的字符 ...
- C语言 strcpy 和 strcpy_s 函数区别 - C语言零基础入门教程
目录 一.strcpy_s 函数/strcpy 函数简介 1.strcpy 函数语法 2.strcpy_s 函数语法 二.strcpy/strcpy_s 函数实战 三.猜你喜欢 零基础 C/C++ 学 ...
- strcpy、strcpy_s、strncpy、strncpy_s 字符串拷贝用法
1.strcpy 原型声明: char *strcpy(char* dest, const char *src); 功能:将以src为首地址的字符串复制到以dst为首地址的字符串,包括'\0'结束符, ...
- C4996:'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead.
使用C语言中字符串的处理函数提示错误 *需包含头文件"string.h" #include "string.h" 以strcpy函数为例 原型:strcpy(s ...
- strcpy()、strncpy()和strcpy_s()函数的区别
1.strcpy()函数 原型声明:char *strcpy(char* dest, const char *src); 头文件:#include <string.h> 和 #includ ...
最新文章
- TCP通信速率与延时关系
- 5添加一块盘_win系统,Linux系统,重装系统后,添加盘简易教程
- fiddler设置中文版本_教你下载iOS老版本应用
- ebook_[EBOOK]十大Java性能问题
- FFMPEG的详细资料可以在它的官方网站上找到
- x86 Assembly Guide
- linux代替ps的软件,Photoshop的开源替代品 图像编辑器GIMP迎来25岁生日
- word java api_Java中的Word文档创建API
- PulseAudio 模块化实现录音和放音
- nfs挂载文件系统时VFS: Unable to mount root fs on unknown-block的问题解决
- 常见的SSL证书错误代码及解决方法
- JVM 性能调整的一些基本概念
- Camera-3A AE/AWB/AF
- LINUX最常见命令
- html怎么去除照片背景颜色,photoshop怎么去除图片背景色
- 2011-09-06 [plus_format_fck.js代码]
- 重来之大学版|卸负篇-对自己大学很失望怎么办?觉得自己大学很不好怎么办?刚到大学不适应怎么办?
- 力扣的组合总和解法 (Python)
- 用计算机绘制函数图像ppt,ppt中怎么绘制三角函数图像?
- 搜索引擎优化排名方法
热门文章
- Nature新子刊创刊首发综述论文:这是你常听到的贝叶斯统计与建模
- 深度解决 SecurityException: User has not given permission to device UsbDevice
- 用Pytorch实现RGB2LAB,LAB2RGB。
- NB-IoT的上行SC-FDMA与下行OFDMA的matlab误码率仿真
- 设备驱动中的并发控制
- 国际性PRO-SID研究开始招募患者,该研究评估Panzyga(R)用于慢性淋巴细胞白血病和继发性免疫缺陷患者的一级预防性治疗
- Win7不激活会怎么样 Win7可以不用激活吗
- 如何给字符串数组赋值
- 电脑文件丢失了怎么恢复?2021最新教程汇总
- 普通数字到科学计数法的转换