CString转为Char*的问题

a5796489 2011-04-06 03:50:36
1、
CString str = L"ABC";
char* c;
c = (LPSTR)(LPCTSTR)str;

2、
CString str = L"ABC";
char* c;
c = (char*)str.GetBuffer(str.GetLength);

用这两种方法执行后结果都不正确,本来预想变量c的值应该为ABC的,但是却只有A这一个字,不解。
...全文
276 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-04-06
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
DX_deepblue 2011-04-06
  • 打赏
  • 举报
回复
结帖率:102.56%
DX_deepblue 2011-04-06
  • 打赏
  • 举报
回复
为什么,楼主的 结帖率:102.56%

什么情况~
luciferisnotsatan 2011-04-06
  • 打赏
  • 举报
回复
lz,你应该把你整个过程的代码贴一下。不然就你给出的那3行,谁会想到你是要把数据变成字节流后发送出去?
a5796489 2011-04-06
  • 打赏
  • 举报
回复
确实如18楼所说,是宽字节转换方式的问题。用了WideCharToMultiByte后问题解决
luciferisnotsatan 2011-04-06
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 a5796489 的回复:]

我要转为char*是为了作为Send的参数来发送的,按楼上的方法转成TChar*后还是要把TChar*强制转为char*,这样数据仍然丢失
[/Quote]
你要用socket发送的话,那按你的转char*就完了。“ABC”的大小为 8个字节(3个字母加结束符,wchar的大小为2字节),还有就是大小端问题。
发送的怎么会数据丢失呢?还是接收处把这宽字符的数据当char给解析了?
mouse_xie 2011-04-06
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 mouse_xie 的回复:]

引用 17 楼 a5796489 的回复:

我要转为char*是为了作为Send的参数来发送的,按楼上的方法转成TChar*后还是要把TChar*强制转为char*,这样数据仍然丢失

C/C++ code

CString str = L"ABC";
wchar_t *wc = str.GetBuffer(str.GetLength());
char *c = new char[w……
[/Quote]

CString str = L"ABC";
wchar_t *wc = str.GetBuffer(str.GetLength());
char *c = new char[wcslen(wc)+1];
memset(c, 0, sizeof(c));
size_t iSize = wcstombs(c, wc, sizeof(c));

delete []c;
str.ReleaseBuffer();
mouse_xie 2011-04-06
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 a5796489 的回复:]

我要转为char*是为了作为Send的参数来发送的,按楼上的方法转成TChar*后还是要把TChar*强制转为char*,这样数据仍然丢失
[/Quote]

CString str = L"ABC";
wchar_t *wc = str.GetBuffer(str.GetLength());
char *c = new char[wcslen(wc)];
memset(c, 0, sizeof(c));
size_t iSize = wcstombs(c, wc, sizeof(c));

delete []c;
str.ReleaseBuffer();

//
iSize = 3;
c = "ABC";
zhengjiankang 2011-04-06
  • 打赏
  • 举报
回复
想要转换。
1.MultiByteToWideChar。WideCharToMultiByte;
2.CA2W CWTA
3.CA2T CT2A

还没见过(char*)(wchar_t*)这样就转换过来了的。
a5796489 2011-04-06
  • 打赏
  • 举报
回复
我要转为char*是为了作为Send的参数来发送的,按楼上的方法转成TChar*后还是要把TChar*强制转为char*,这样数据仍然丢失
luciferisnotsatan 2011-04-06
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 a5796489 的回复:]

大概是因为把单字节的操作改成了双字节的,所以就多取到了一个字节的数,但还是没有从根上解决问题~
[/Quote]
你是想把宽字节版本的CString转成char*?

CString str = _T("ABC");
TCHAR *c;
c = str.GetBuffer(str.GetLength());
_tprintf(_T("%d %s\n"),str.GetLength(), c);

char *sz=new char[str.GetLength()+1];
memset(sz,0,str.GetLength()+1);
wcstombs(sz,c,3);
printf("%d %s", strlen(sz),sz);

//不要忘了释放
delete[] sz;
str.ReleaseBuffer();
mouse_xie 2011-04-06
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 a5796489 的回复:]

大概是因为把单字节的操作改成了双字节的,所以就多取到了一个字节的数,但还是没有从根上解决问题~
[/Quote]
按照你的需求,c肯定是"ABC"没错的。

至于你工程的属性问题,最好参照10楼的搞法。免得改来改去
a5796489 2011-04-06
  • 打赏
  • 举报
回复
大概是因为把单字节的操作改成了双字节的,所以就多取到了一个字节的数,但还是没有从根上解决问题~
mouse_xie 2011-04-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 a5796489 的回复:]

引用 4 楼 mouse_xie 的回复:
Unicode -> MultiBytes 你这样是不对地。

C/C++ code
CString str = L"ABC";
wchar_t *wc = str.GetBuffer(str.GetLength());
char c[20];
wcstombs(c, wc, sizeof(c));

这样的话取到的其实就是双字节的数……
[/Quote]
怎么可能???20个字节还不够装你的ABC???
luciferisnotsatan 2011-04-06
  • 打赏
  • 举报
回复
你的工程设置里应该设的是字符集设的是unicode吧。
CString用的是 TCHAR,这里也就是wchar_t版本的。
a5796489 2011-04-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mouse_xie 的回复:]
Unicode -> MultiBytes 你这样是不对地。

C/C++ code
CString str = L"ABC";
wchar_t *wc = str.GetBuffer(str.GetLength());
char c[20];
wcstombs(c, wc, sizeof(c));
[/Quote]
这样的话取到的其实就是双字节的数值,而c的值就变成了"AB".....还是不能读全
luciferisnotsatan 2011-04-06
  • 打赏
  • 举报
回复
建议你写成
	CString str = _T("ABC");
TCHAR *c;
c = str.GetBuffer(str.GetLength());
_tprintf(_T("%d %s"),str.GetLength(), c);

这样你工程设置里改了,就不用改代码了
pathuang68 2011-04-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 luciferisnotsatan 的回复:]

随便膜拜下lz的结贴率
结帖率:102.63%
[/Quote]
是哦,是不是CSDN的卧底?这么高的结贴率。mb
pathuang68 2011-04-06
  • 打赏
  • 举报
回复
str.GetBuffer(str.GetLength() + 1);试试,
因为c没有分配内存,所以要在GetBuffer中指顶c的大小,否则装不下。
加载更多回复(7)

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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