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高级,但是却不是想要的。当回归到这种较为底层的东西的时候,感觉反而特别的高级了,或许这是一种思维逻辑上的转变吧。