为什么小弟我的字符显示不正确,哪位大神给详细讲解一下,不胜感激

为什么我的字符显示不正确,哪位大神给详细讲解一下,不胜感激
我看的是孙鑫的异步套接字网络编程的聊天室程序,他用的是VC6.0,而我用的是VS08。
代码如下
case FD_READ:
WSABUF wsabuf;
wsabuf.buf=new char[200];
wsabuf.len=200;
DWORD dwRead;
DWORD dwFlag=0;
SOCKADDR_IN addrFrom;为什么小弟我的字符显示不正确,哪位大神给详细讲解一下,不胜感激
int len=sizeof(addrFrom);
CString str;
if(SOCKET_ERROR==WSARecvFrom(m_socket,&wsabuf,1,&dwRead,&dwFlag,(SOCKADDR*)&addrFrom,&len,NULL,NULL))
{
MessageBox(_T("接收数据失败!"));
return false;
}
str.Format(_T("from %s said:%s "),(LPTSTR)inet_ntoa(addrFrom.sin_addr),(LPTSTR)wsabuf.buf);
CString temp;
GetDlgItemText(IDC_Recv,temp);
temp+=_T("/r/n")+str;
SetDlgItemText(IDC_Recv,temp);

------解决方案--------------------
没有根据收到的字节长度,对缓冲区的最后一位设置\0,而直接把缓冲区当字符串使用,所以后面都是未初始化的内存内容。

另外"/r/n",是笔误吧,"\r\n"才是C字符串换行标准。
------解决方案--------------------
没有设置字符串结束标记\0
------解决方案--------------------
wsabuf.buf=new char[200];
ZeroMemory(wsabuf,200);
------解决方案--------------------
把UNICODE字符集改成多字节字符集试试,方法:项目-》项目属性-》常规-》字符集
------解决方案--------------------
还有就是str.Format(_T("from %s said:%s "),(LPTSTR)inet_ntoa(addrFrom.sin_addr),(LPTSTR)wsabuf.buf),这条语句(LPTSTR)wsabuf.buf不要进行强制转换,会导致数据的丢失,不进行可能会出错,但改了字符集就应该没有问题了
------解决方案--------------------
引用:
Quote: 引用:

还有就是str.Format(_T("from %s said:%s "),(LPTSTR)inet_ntoa(addrFrom.sin_addr),(LPTSTR)wsabuf.buf),这条语句(LPTSTR)wsabuf.buf不要进行强制转换,会导致数据的丢失,不进行可能会出错,但改了字符集就应该没有问题了

问题已经解决,真的很感谢你。请问你能不能详细的给我说一下VS和VC中字符集的区别,在网上也搜过,但不是很理解啊,我在用VS8的时候,字符集这些地方经常出问题,真的很感激你

VS平台默认工程默认设置是采用“Unicode字符集”(Unicode Character Set)的,以前用VC6工程的时候默认是“多字符集”(Multi-Byte Character Set)的。“多字符集”是在ASCLL编码基础上加上各国语言扩展而来,所以你用VC6的那种字符处理函数,就会出现字符串转换错误啊,转换之后又导致数据丢失等等错误,。总之就是,如果采用UNICODE字符集,就使用UNICODE这方面的函数。采用多字节字符集就采用多字节处理函数。关于字符集的问题,建议还是找一些关于信息在计算机系统中的表示资料来看。网上也有很多博主写的博客