关于从“CString”转换为“const char *”的问题

live_for_you 2009-11-12 10:38:41
编译平台:VC2008
程序说明:用MFC做的一个聊天室软件,其中类型转换出了问题

原代码:sendto(m_socket,strSend,strSend.GetLength()+1,0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR));
错误提示:不能将参数 2 从“CString”转换为“const char *”

修改为:sendto(m_socket,strSend.GetBuffer(),strSend.GetLength()+1,0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR));
错误提示:不能将参数 2 从“wchar_t *”转换为“const char *”

修改为:sendto(m_socket,(LPCWSTR)strSend,strSend.GetLength()+1,0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR));
错误提示:不能将参数 2 从“LPCWSTR”转换为“const char *”

修改为sendto(m_socket,(LPCSTR)(LPCTSTR)strSend,strSend.GetLength()+1,0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR));
编译通过,但是运行程序后,输入要发送的消息,点击发送按钮,弹出Debug Assertion Faild!的错误提示,提示说:Incorrect format specifier.

个人觉得一定是类型转换除了问题,不知道这种转换该怎么转,请求高手指示。
先谢过。
...全文
1907 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
hecha 2009-11-15
  • 打赏
  • 举报
回复
CString str = _T("abc");      // 错误的
CString str(_T("abc")); // 正确的
CString str; str = _T("abc"); // 正确的

这是因为 CString 的构造函数声明为 explict
live_for_you 2009-11-14
  • 打赏
  • 举报
回复
现在很多方法都能使编译通过,但是还是会出现最后一个问题
编译通过,但是运行程序后,输入要发送的消息,点击发送按钮,弹出Debug Assertion Faild!的错误提示,提示说:Incorrect format specifier.
bragi523 2009-11-13
  • 打赏
  • 举报
回复
sendto(m_socket,(const char*)strSend.Getbuffer(),strSend.GetLength()+1,0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR));
这样转可以
但是长度还是不对
最好lz先把他转成char *然后求长度
USES_CONVERSION;
sendto(m_socket,(const char*)W2A(strSend.Getbuffer()),strlen(W2A(strSend.Getbuffer())),0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR));
gavinma 2009-11-13
  • 打赏
  • 举报
回复
W2A或者A2W就可以相互转换,但要少用,代码楼上的可以。
trs_guoyunhui 2009-11-13
  • 打赏
  • 举报
回复
UNICODE环境下试试这样转换:

CString str=_T("cstring");
USES_CONVERSION;
CHAR* pch=W2A(str);
ccpaishi 2009-11-13
  • 打赏
  • 举报
回复
(char*)((CString).GetBuffer(0))
live_for_you 2009-11-12
  • 打赏
  • 举报
回复
额···不好意思,那是另一个错误的提示,改过来后,通过编译,但是和我帖子里说的最后一个现象相同
编译通过,但是运行程序后,输入要发送的消息,点击发送按钮,弹出Debug Assertion Faild!的错误提示,提示说:Incorrect format specifier.

11点05分断网,如没回复,见谅
muzizongheng 2009-11-12
  • 打赏
  • 举报
回复
贴出你的chatdlg错误代码, 其实就应该按我说的, 用那个函数转化, 因为编程最好用unicode来

系统的api实现从NT就开始全部是unicode了 你传非unicode时, 系统也是先把你传的通过函数转换成unicode, 再调用unicode版本的函数, 这样就造成了时间和空间上的开销.

不用WideCharToMultiChar的话也可以用W2A宏来转换, 看看msdn就知道了.
WaistCoat13 2009-11-12
  • 打赏
  • 举报
回复
chatdlg.cpp(207)

你这行咋写的?
live_for_you 2009-11-12
  • 打赏
  • 举报
回复
将工程设置里字符集设置为“使用多字节”后
错误提示:
c:\users\asus\documents\visual studio 2008\projects\chat\chat\chatdlg.cpp(207) : error C2440: “初始化”: 无法从“wchar_t *”转换为“ATL::CStringT<BaseType,StringTraits>”
1> with
1> [
1> BaseType=char,
1> StringTraits=StrTraitMFC_DLL<char>
1> ]
1> class“ATL::CStringT<BaseType,StringTraits>”的构造函数声明为“explicit”
1> with
1> [
1> BaseType=char,
1> StringTraits=StrTraitMFC_DLL<char>
1> ]
muzizongheng 2009-11-12
  • 打赏
  • 举报
回复
简单的就是直接讲工程的字符集设置为宽字符

当然或者可以用WideCharToMultiChar来把Unicode的CString转换成const char
WaistCoat13 2009-11-12
  • 打赏
  • 举报
回复
将工程设置里字符集设置为“使用多字节”的
WaistCoat13 2009-11-12
  • 打赏
  • 举报
回复
将工程设置的非UNICODE的

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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