C++的字符串拷贝函数
wcscpy_s(pValue, *pBufLen, strValue.c_str()); //不能用于跨pe,dll的内存拷贝
memcpy_s(pValue, *pBufLen, strValue.c_str(), nLen);
wcscpy_s
wcscpy_s是拷贝宽字符串的安全函数。它返回一个error_t类型的值。
wcscpy_s的函数原型为:
error_t wcscpy_s(wchar_t * strDestination, //目的缓冲区的地址
size_t numberOfCharacters, //缓冲区大小(以字符计,一个字符2个字节)
const wchar_t * strSource); //源字符串的指针
下面是一个例子:
PCWSTR string = TEXT("mydef");WCHAR buff[6];wcscpy_s(buff, _countof(buff), string);
其中TEXT是一个宏,该宏能够自动判断当前字符集环境(Unicode还是ANSI还是其他的)并进行适当的转换。
与其类似的还有以下函数:wcscat_s
error_t wcscat_s(wchar_t *strDestination,size_t numberOfCharacters,const wchar_t *strSource)
wcscpy_s是对应于wcscpy的安全版本。
CString cstrVolDesc;
wchar_t* label = new wchar_t[100];
..
..
//wcscpy_s(label, cstrVolDesc.GetLength(), cstrVolDesc.GetString()); //error:"Buffer too small"
wcscpy_s(label, cstrVolDesc.GetLength()+1, cstrVolDesc.GetString());
..
使用wcscpy_s一定要保证目标字符串的大小一定要比源字符串大,而且第二个参数指定的数量至少等于源字符串的大小+1(包括最后的\0)
wcsncpy_s
带n的cpy函数是“安全”的。
申请字符内存后,初始化字符内存常用的方法是:memset(pszc, 0, n * sizeof(wchar_t));
或者拷贝完后强制末尾 szNEW[n-1] = 0; 我用 szNEW[n-1] = 0;
void Test(const wchar_t *test1)
{wchar_t * pszc = new wchar_t[wcslen(test1)];wcsncpy_s(pszc, wcslen(pszc), test1, wcslen(test1)); //用wcsncpy_s 执行delete[] pszc就会提示 Heap block at xxx modified at xxx past requested size//wcsncpy(pszc, test1, wcslen(test1)); //可以正常delete[] pszc的delete[] pszc;
}
pszc申请内存后并没有初始化,其实际数据是乱的,也是不可预料的。所以wcslen(pszc)的结果可大可小,一般是一个很大的数字,所以用wcsncpy_s越界概率很大。另外,C风格字符串一定要考虑终止符,否则也很可能刚好越界。
正确写法:
size_t n = wcslen(test1)+1; // +1,包括终止符
wchar_t *newc = new wchar_t[n];
wcsncpy_s(newc, n,test1, n);
memcpy_s
相较于memcpy,memcpy_s会检查:
1) dest、src的合法性;
2)检查destsz、count的合法性;
3)检查缓存异常的风险;
4)检查目的buf和源buf是否存在内存覆盖。
C++的字符串拷贝函数相关推荐
- 字符串拷贝函数memcpy()、strncpy()和snprintf()性能之比较
问题: 函数memcpy(dest, src, sizeof(dest)).strncpy(dest, src, sizeof(dest))和snprintf(dest, sizeof(dest), ...
- 【C 语言】字符串拷贝 ( 函数形参使用推荐方法 | 凡是涉及 修改指针指向 的操作一律创建新的 指针变量 执行 | 引入 辅助 局部 指针变量 )
文章目录 一.函数形参使用推荐方法 二.完整代码示例 一.函数形参使用推荐方法 在函数中 , 形参 中的 指针变量 , 不建议直接使用 ; 推荐 在 函数中 , 定义 局部 指针变量 , 接收 形参中 ...
- 字符串拷贝函数:strcpy的详解及模拟实现
字符串拷贝函数:strcpy的详解及模拟实现!!! 对于字符串拷贝函数,之前在学习字符串时候,就已经学习过,但那只是片面的学习了一下,并没有经过系统的分析!只是大概的学习了一下!在关键的地方有时候还不 ...
- 【C语言】字符串拷贝函数(strcpy)与内存拷贝函数的不同及内存拷贝函数(memcpy)的模拟实现
目录 字符串拷贝函数(strcpy) 函数原型 应用实例 我们将一个存放"abcdefg"的字符数组arr的内容拷贝到字符数组brr之中. 缺点 内存拷贝函数(memcpy) 函数 ...
- 字符串拷贝函数strdup()
char *strdup(const char *s); 注: strdup()函数是c语言中常用的一种字符串拷贝库函数,一般和free()函数成对出现. 字符串拷贝函数strdup()内部实现如下: ...
- 字符串拷贝函数Strcpy的实现
实现字符串拷贝函数时,一定要分清楚源头的字符串和目的字符串,两者的位置不同,首先是方法1: #include<stdio.h> #include<assert.h> void ...
- C++之 字符串拷贝函数(面试题目)
1.已知strcpy 函数的原型是: char *strcpy(char *strDest, const char *strSrc); 其中strDest 是目的字符串,strSrc 是源字符串.不调 ...
- 如何字符串拷贝函数的几种方法,你猜哪个效率最高?
strcpy,即string copy(字符串复制)的缩写. 是C语言标准库中实现字符串拷贝的一个函数. 各大公司笔试题最喜欢考的一道题,快来看看,你会几种方法? 问:你会如何实现这个函数呢? 1 v ...
- c语言 字符串拷贝函数作用,C语言不使用strcpy函数如何实现字符串复制功能
Ⅰ )字符串复制函数 字符串复制是字符串操作中比较常用的操作之一.C语言库函数中提供的字符串复制函数是:strcpy函数.该函数的功能为:把源字符数组中的字符串复制到目的字符数组中,字符串结束标志&q ...
- strncpy函数,字符串拷贝函数(长度受限制)
//字符串受限制 strncpy函数 int main() { char arr1[20] = "abcdef"; char arr2[] = &quo ...
最新文章
- 数据安全最佳实践案例库建设项目案例征集
- 转载模板声明中template typename T和template class T
- Python教程:如何将list嵌套的list的[]去掉
- JLabel跟label
- 5.9 QR分解--Gram-Schmidt 分解
- 分数DRL:在OptaPlanner中更快,更轻松
- Android中GC的触发时机和条件
- sdut 取数字问题(深搜,动态规划)
- 常见的运行时异常 java 1615309080
- input内强制保留小数点后两位 位数不足时自动补0
- 荣耀与美团合作推出 “共享笔记本”;传腾讯建议推出美国版微信,已被否;Debian 10.6 稳定版发布|极客头条
- 安卓颜色标签android
- 从0开始学习 GitHub 系列之「02.加入 GitHub」
- AfxGetMainWnd 函数
- Windows又又又更新?Win 12开发将于下个月开始
- 阿里高校实践计划 class6 搭建nas个人网盘
- 怎样进行微信营销才比较好
- 当动作捕捉遇上圣诞节,原来如此有趣
- 从苏宁电器到卡巴斯基第35篇:番外篇——晒一晒病毒分析师的桌面(下)
- Pandas函数read_csv的参数na_values的用法
热门文章
- 大一学生HTML期末作业 【html体育羽毛球6页面带注册】学生网页设计作业源码
- SharePoint网站定义
- hosts文件修改,重启生效
- Python 将网址url转换成二维码
- 重温数据结构:哈希 哈希函数 哈希表
- Resultset获取数据
- rosdep init rosdep update千古难题
- 织梦cms--dedecms学习重要资料
- html页面实现视频播放器,实现简易html视频播放器的方法
- (流水车间调度 FSSP) NEH启发式算法改进 (时间复杂度从 O(mn^3) 降至 O(mn^2) )