关于字符串拷贝问题!

程序漫步 2012-10-26 02:33:42
char *m_buffer[500];
char *client_buf = "hh";
memcpy(m_buffer,client_buf,strlen(client_buf));
cout<<(char *)m_buffer<<endl;

打印出来的是 hh<- 后面怎么总跟着有乱码
...全文
189 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
dpdp_2012 2012-10-26
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]
short data = 10;
memcpy(m_buffer ,&data,sizeof(data));
cout<<m_buffer<<endl;

这种情况,输出为空的!!
[/Quote]

data=10 十六进制为0x000a
在小端模式下内存中为0a00
然后拷到m_buffer处,所以m_buffer内存中为0a00
所以cout<<m_buffer<<endl;应输出ascii码10对应的字符,但是因为是个控制字符,输不出来,所以你看到的是输出为空

改下short data = 'a'; 就能输出a
proorck6 2012-10-26
  • 打赏
  • 举报
回复
strlen(client_buf)+1
就没问题了,字符串末尾还有一个'\0',你没复制它。
程序漫步 2012-10-26
  • 打赏
  • 举报
回复
short data = 10;
memcpy(m_buffer ,&data,sizeof(data));
cout<<m_buffer<<endl;

这种情况,输出为空的!!
lin5161678 2012-10-26
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

这个问题很简单,因为 你没有初始化你的分配的空间,所以他就从内存中随机的分配数据在这500个位置。你可以这样试试,就会没有乱码;
char *m_buffer[500];
memset(m_buffer,0,500);
char *client_buf = "hh";
memcpy(m_buffer,client_buf,strlen(client_buf));
cout<<(char……
[/Quote]
你既然知道 只是缺一个结束符
为什么 你喜欢给 500*sizeof(char*)个结束符
怕CPU太闲吗 ~~~~汗
lin5161678 2012-10-26
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

没指到非法区域就不会报错
[/Quote]
1 已经指到了
2 指到了也不会报错 不过运行时 会不会奔溃就不好说了
如影随从 2012-10-26
  • 打赏
  • 举报
回复
这个问题很简单,因为 你没有初始化你的分配的空间,所以他就从内存中随机的分配数据在这500个位置。你可以这样试试,就会没有乱码;
char *m_buffer[500];
memset(m_buffer,0,500);
char *client_buf = "hh";
memcpy(m_buffer,client_buf,strlen(client_buf));
cout<<(char *)m_buffer<<endl;

这样的话就使每位都是结束符。就不会出现乱码
dpdp_2012 2012-10-26
  • 打赏
  • 举报
回复
memcpy看函数原型就知道编译期间 超出数字范围 不会给你报错
因为参数只有char* 没有maxLen之类参数的,memcpy函数根本不知道你传过来的地址不能超出哪个范围
baichi4141 2012-10-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

memcpy(m_buffer+600,client_buf,strlen(client_buf)+1);


超出这个数组。。怎么不报错呀???
[/Quote]
我说过了
“如果碰巧整个内存里都没有'\0',程序可以把整个内存的数据的ASCII码给你打印出来”

C风格的函数,特点就是效率优先,安全性交给程序员去考虑
报错?memcpy这类标准C函数不负责这个,哪怕你电脑烧掉了那也是你的责任,它们只负责“尽可能高效的完成你交付的任务”,至于这个任务合不合理,它们完全不在意
dpdp_2012 2012-10-26
  • 打赏
  • 举报
回复
没指到非法区域就不会报错
程序漫步 2012-10-26
  • 打赏
  • 举报
回复
memcpy(m_buffer+600,client_buf,strlen(client_buf)+1);


超出这个数组。。怎么不报错呀???
__天涯寻梦 2012-10-26
  • 打赏
  • 举报
回复
看错了,如果是填充字符串就
strcpy(m_buffer + 10, client_buf);
__天涯寻梦 2012-10-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
哦 谢谢

问下如果 我想在 m_bufer 的第 10个位置 填充字符串的话

是不是 *m_bufer + 10 ????? 这样

还有 为什么 说 最好 char m_buffer[500]
[/Quote]
m_buffer[10] = ...;
*(m_buffer + 10) = ...;
dpdp_2012 2012-10-26
  • 打赏
  • 举报
回复
在 m_bufer 的第 10个位置 填充字符串
memcpy(m_buffer+10,client_buf,strlen(client_buf)+1);

还有 为什么 说 最好 char m_buffer[500]
既然你存数据取数据都是当作char [],那为什么定义的时候要char* []呢
lin5161678 2012-10-26
  • 打赏
  • 举报
回复
char* m_buffer[500];
m_buffer[0]这个是一个指针 char*类型 不是char
lin5161678 2012-10-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

还有 为什么 说 最好 char m_buffer[500]
[/Quote]
因为你从头到尾都是吧m_buffer当做一个char[500] 在使用
当然得定义为char[500]
程序漫步 2012-10-26
  • 打赏
  • 举报
回复
哦 谢谢

问下如果 我想在 m_bufer 的第 10个位置 填充字符串的话

是不是 *m_bufer + 10 ????? 这样

还有 为什么 说 最好 char m_buffer[500]
dpdp_2012 2012-10-26
  • 打赏
  • 举报
回复
试试
memcpy(m_buffer,client_buf,strlen(client_buf)+1);
还有最好是char m_buffer[500]
baichi4141 2012-10-26
  • 打赏
  • 举报
回复
C风格字符串以'\0'也就是十六进制0值做结束符
后面有乱码是因为你没有设置字符串结束符,程序认为这一块的内存都是你想要的字符串数据,乱码长度取决于哪里碰巧有一个'\0',于是程序认为到这里字符串结束
如果碰巧整个内存里都没有'\0',程序可以把整个内存的数据的ASCII码给你打印出来
__天涯寻梦 2012-10-26
  • 打赏
  • 举报
回复
char *m_buffer[500];
这样分配的内存区域里面的值是未定的,复制了两个h后面的那个字节很可能不是0而导致字符串没有结束
memcpy(m_buffer,client_buf,strlen(client_buf) + 1);

strcpy(m_buffer,client_buf);
把字符串结束符0也复制进去

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧