memcpy的使用以及其引出的‘\0’显示问题
来源:互联网 发布:主图BS点指标公式源码 编辑:程序博客网 时间:2024/05/15 14:41
先把代码写上:
#include <iostream>#include <cstring>using namespace std;int main(){ char buffer[20] ; char name[16]="This" ; for(int i = 4 ; i < sizeof(name) ; i++) { name[i] = '\0' ; } cout <<name ; int x = 589089 ; memcpy(buffer,name,sizeof(name)) ; memcpy(buffer+16,&x,sizeof(int)) ; for(int i = 0 ; i < sizeof(name) ; i++) { cout << name[i] ; } cout << endl ; for(int i = 0 ; i < sizeof(buffer) ; i++) { cout << buffer[i] ; } cout << endl ; int t ; memcpy(&t,buffer+sizeof(name),sizeof(int)) ; cout << t ; return 0;}
输出结果为:
有点乱- -。
name输出为This,将name全部输出为Thisaaaaa...
将buffer输出为Thisaaaaaa...a
觉得有些奇怪,'\0'怎么会显示为a呢
a的ASIC为97。
开始怀疑是初始化后并没有将后续字符初始化为‘\0’,手动设置后问题依旧,这个就不懂了。
不过刚刚粘贴的时候发现,后面的aaaaa粘贴后是不显示的,我想,这或许是控制台输出的问题了。。。
说说问题的关键,
memcpy(char* des,char * source,int size);
即从des地址source地址开始,将[source]->[des],[sources+1]->[des+1],...,[source+size-1]->[des+size-1];
完全的内存复制,不会进行字符转换什么的。
由此可以将int型数据写入到buffer中,这在二进制读写文件时应该是非常有用的。
我们可以整个读取一块buffer,然后分别将其memcpy到相应的变量,最后就可以正确显示了。
够直接,够有效。
最近在写DBMS的简单实现,需要Insert 一个元组数据到文件,一直在找一种方法可以把定长char,int等类型数据所对应的的二进制码先结合在一起,最后一次write到文件,开始试了sprintf,结果它把int变成char写入了buffer,实际上这比memcpy高级,但是却不是想要的。当回归到这种较为底层的东西的时候,感觉反而特别的高级了,或许这是一种思维逻辑上的转变吧。
- memcpy的使用以及其引出的‘\0’显示问题
- memcpy的使用问题
- 使用removeAll所引出的问题
- 使用memcpy()出现的问题
- #引出的各种问题
- lambda引出的问题
- VC8实现的一个PC端查看TSK主题文件的工具,以及由其引出的VC8MFC程序脱离.net框架分发问题
- day16--泛类概念的引出以及使用的…
- 理解程序调用以及由此引出的缓冲区攻击问题
- memcpy函数的使用遇到的问题
- 由一个简单示例 引出java继承中父子类成员变量共享问题 以及super的使用
- 指针初始化引出的问题
- z-order引出的问题
- 二分查找引出的问题
- z-order引出的问题
- z-order引出的问题
- ORA-12519引出的问题
- PhotoCamera引出的一个问题
- 动态规划入门——Function Run Fun
- gcc 编译一个C文件的过程分析,动态链接生成
- Leetcode: Merge k Sorted Lists
- android学习_Activity
- android SQLite操作方法总结,SQLite用法,SQLiteOpenHelper
- memcpy的使用以及其引出的‘\0’显示问题
- android基础--有返回值的Activity
- 人人都能用的10条网站易用性技巧
- ubuntu笔记4_mysql数据库安装
- Leetcode: Single Number
- "卧槽泥马”和“马勒戈壁”竟然真的是成语、我疯了……
- 网络编程基础-http协议
- 关于测试程序运行时间
- 关于C++中enum的探讨