博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
百篇大计敬本年之C语言巅峰之道《四》—— strcpy 与 memcpy 的区别
阅读量:6368 次
发布时间:2019-06-23

本文共 755 字,大约阅读时间需要 2 分钟。

  hot3.png

    在程序设计的时候,遇到了这么一个Bug,复制一段 buf 总是缺斤少两,导致程序运行总是出现奇奇怪怪的现象,进过自己观察,才发现了问题根源:

char *strcpy(char *dest, const char *src);

    strcpy ,原意string copy ,字符串拷贝,将 src 里面的字符串复制到 dest 里面,但是,有一个限制,它是从 src 第一个字符开始,到最近一个 '\0' 结束的位置,它将复制这一区间的数据,'\0'后的数据将被忽略,如下:

    char dest[32] = {0};    char buf[] = {'I', ' ', 'a', 'm', ' ', 'b', 'u', 'f', ' ', 'o','n', 'e', '\0', 'O', 'v', 'e', 'r'};    strcpy(dest, buf);

    最终 dest 中的数据为 "I am buf one",而没有后面的 "Over" 单词,因为 strcpy 遇到 '\0' 时将结束拷贝(strlen与之一样,在遇到'\0'时停止计数),所以要想将 buf 中的全部内容复制进dest 中,可以换用 memcpy ,memcpy 是内存拷贝函数,与strcpy的区别是,拷贝内存中指定地址开始的指定长度的内存数据,而不去检查内存数据是什么。

    借此警醒,对复制函数的使用一定要分清场合,如果单单是字符串的拷贝,可以使用字符串函数(还要注意该字符串的长度,一个字符串的结束是'\0',如果一个字符串中间插入了多个'\0',那么就会被分为多个字符串),但如果包含其他数据,建议使用memcpy。

 

 

转载于:https://my.oschina.net/bingwu/blog/916979

你可能感兴趣的文章
『Data Science』R语言学习笔记,获取数据
查看>>
rails中n秒页面自动跳转
查看>>
我的友情链接
查看>>
忘记root用户密码怎么办?
查看>>
esxi定时任务
查看>>
Scaffold-DbContext
查看>>
关于VMware Workstation主机列表问题求教
查看>>
配置管理小报101021:给ubuntu加监控
查看>>
qml文字滚动效果的封装,实现方式运用的qml中提供的动画效果,另一种实现方式也可以使用定时器修改控件的坐标来实现...
查看>>
标准C++实现任务队列
查看>>
jdbc url
查看>>
刷leetcode第704题-二分查找
查看>>
debug_backtrace() 函数生成一个 backtrace(追踪)
查看>>
第七天,还是盒子
查看>>
XAMPP软件包下载
查看>>
XXL-JOB初体验-ORACLE版
查看>>
沉思录:别人的棺材
查看>>
jersey + spring + mybatis + redis项目搭建
查看>>
PAT 1006 部分正确_另一种解法
查看>>
在Keil环境下使用JLink实现printf输出重定向至debug窗口
查看>>