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++的字符串拷贝函数相关推荐

  1. 字符串拷贝函数memcpy()、strncpy()和snprintf()性能之比较

    问题: 函数memcpy(dest, src, sizeof(dest)).strncpy(dest, src, sizeof(dest))和snprintf(dest, sizeof(dest), ...

  2. 【C 语言】字符串拷贝 ( 函数形参使用推荐方法 | 凡是涉及 修改指针指向 的操作一律创建新的 指针变量 执行 | 引入 辅助 局部 指针变量 )

    文章目录 一.函数形参使用推荐方法 二.完整代码示例 一.函数形参使用推荐方法 在函数中 , 形参 中的 指针变量 , 不建议直接使用 ; 推荐 在 函数中 , 定义 局部 指针变量 , 接收 形参中 ...

  3. 字符串拷贝函数:strcpy的详解及模拟实现

    字符串拷贝函数:strcpy的详解及模拟实现!!! 对于字符串拷贝函数,之前在学习字符串时候,就已经学习过,但那只是片面的学习了一下,并没有经过系统的分析!只是大概的学习了一下!在关键的地方有时候还不 ...

  4. 【C语言】字符串拷贝函数(strcpy)与内存拷贝函数的不同及内存拷贝函数(memcpy)的模拟实现

    目录 字符串拷贝函数(strcpy) 函数原型 应用实例 我们将一个存放"abcdefg"的字符数组arr的内容拷贝到字符数组brr之中. 缺点 内存拷贝函数(memcpy) 函数 ...

  5. 字符串拷贝函数strdup()

    char *strdup(const char *s); 注: strdup()函数是c语言中常用的一种字符串拷贝库函数,一般和free()函数成对出现. 字符串拷贝函数strdup()内部实现如下: ...

  6. 字符串拷贝函数Strcpy的实现

    实现字符串拷贝函数时,一定要分清楚源头的字符串和目的字符串,两者的位置不同,首先是方法1: #include<stdio.h> #include<assert.h> void ...

  7. C++之 字符串拷贝函数(面试题目)

    1.已知strcpy 函数的原型是: char *strcpy(char *strDest, const char *strSrc); 其中strDest 是目的字符串,strSrc 是源字符串.不调 ...

  8. 如何字符串拷贝函数的几种方法,你猜哪个效率最高?

    strcpy,即string copy(字符串复制)的缩写. 是C语言标准库中实现字符串拷贝的一个函数. 各大公司笔试题最喜欢考的一道题,快来看看,你会几种方法? 问:你会如何实现这个函数呢? 1 v ...

  9. c语言 字符串拷贝函数作用,C语言不使用strcpy函数如何实现字符串复制功能

    Ⅰ )字符串复制函数 字符串复制是字符串操作中比较常用的操作之一.C语言库函数中提供的字符串复制函数是:strcpy函数.该函数的功能为:把源字符数组中的字符串复制到目的字符数组中,字符串结束标志&q ...

  10. strncpy函数,字符串拷贝函数(长度受限制)

    //字符串受限制       strncpy函数 int main() {     char arr1[20] = "abcdef";     char arr2[] = &quo ...

最新文章

  1. 数据安全最佳实践案例库建设项目案例征集
  2. 转载模板声明中template typename T和template class T
  3. Python教程:如何将list嵌套的list的[]去掉
  4. JLabel跟label
  5. 5.9 QR分解--Gram-Schmidt 分解
  6. 分数DRL:在OptaPlanner中更快,更轻松
  7. Android中GC的触发时机和条件
  8. sdut 取数字问题(深搜,动态规划)
  9. 常见的运行时异常 java 1615309080
  10. input内强制保留小数点后两位 位数不足时自动补0
  11. 荣耀与美团合作推出 “共享笔记本”;传腾讯建议推出美国版微信,已被否;Debian 10.6 稳定版发布|极客头条
  12. 安卓颜色标签android
  13. 从0开始学习 GitHub 系列之「02.加入 GitHub」
  14. AfxGetMainWnd 函数
  15. Windows又又又更新?Win 12开发将于下个月开始
  16. 阿里高校实践计划 class6 搭建nas个人网盘
  17. 怎样进行微信营销才比较好
  18. 当动作捕捉遇上圣诞节,原来如此有趣
  19. 从苏宁电器到卡巴斯基第35篇:番外篇——晒一晒病毒分析师的桌面(下)
  20. Pandas函数read_csv的参数na_values的用法

热门文章

  1. 大一学生HTML期末作业 【html体育羽毛球6页面带注册】学生网页设计作业源码
  2. SharePoint网站定义
  3. hosts文件修改,重启生效
  4. Python 将网址url转换成二维码
  5. 重温数据结构:哈希 哈希函数 哈希表
  6. Resultset获取数据
  7. rosdep init rosdep update千古难题
  8. 织梦cms--dedecms学习重要资料
  9. html页面实现视频播放器,实现简易html视频播放器的方法
  10. (流水车间调度 FSSP) NEH启发式算法改进 (时间复杂度从 O(mn^3) 降至 O(mn^2) )