SetItemText() 出现乱码问题!!!

wangsiyuanoo 2008-12-11 12:59:29

char strAttr[128] = {0};

CS_BaseCreature * pCreature = new CS_BaseCreature;
long iATTR = pCreature->GetAttr(attr);
sprintf(strAttr, _T("%d"), iATTR); //调试的时候,strAttr正常输出,比如是"0"

m_NpcList.SetItemText(0, 2, strAttr); //显示出来的却是乱码.......

delete pCreature;

return strAttr;


项目是在VS2003的多字节环境下!
不准用CString进行转换,求解!!!
...全文
329 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
mark
arong1234 2008-12-11
  • 打赏
  • 举报
回复
你delete的和你返回的毫无关系,你返回的是那个字符串,而你字符串是存在一个临时数组上的,这是不合法的
wangsiyuanoo 2008-12-11
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 bobye1230 的回复:]
你返回之后...用完之后再delete咯..不然会出错的..

引用 9 楼 wangsiyuanoo 的回复:
引用 8 楼 arong1234 的回复:
如果你要返回一个char*,必须new一个,不能用临时数组



C/C++ code
char * CClientNpcDlg::AttrLongToString(const int attr)
{
char * strAttr = new char[128]; //这样么?但最后不是要delete strAttr, 还怎么返回呢?

CS_BaseCreature * pCreature = new CS_BaseCreature;…
[/Quote]
你的意思是说在析构函数里delete么?
可我这个是局部变量啊
按你说的先return
然后delete
不是最后一样不会返回结果嘛,都delete了
我的说的对么?
bobye1230 2008-12-11
  • 打赏
  • 举报
回复
你返回之后...用完之后再delete咯..不然会出错的..

[Quote=引用 9 楼 wangsiyuanoo 的回复:]
引用 8 楼 arong1234 的回复:
如果你要返回一个char*,必须new一个,不能用临时数组



C/C++ code
char * CClientNpcDlg::AttrLongToString(const int attr)
{
char * strAttr = new char[128]; //这样么?但最后不是要delete strAttr, 还怎么返回呢?

CS_BaseCreature * pCreature = new CS_BaseCreature;

TCHAR strTemp[128] = {0};
long iATTR = pCreature->GetAttr(attr);
s…
[/Quote]
wiowei 2008-12-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wangsiyuanoo 的回复:]
引用 8 楼 arong1234 的回复:
如果你要返回一个char*,必须new一个,不能用临时数组



C/C++ code
char * CClientNpcDlg::AttrLongToString(const int attr)
{
char * strAttr = new char[128]; //这样么?但最后不是要delete strAttr, 还怎么返回呢?

CS_BaseCreature * pCreature = new CS_BaseCreature;

TCHAR strTemp[128] = {0};
long iATTR = pCreature->GetAttr(attr);
s…
[/Quote]

在你没有delete[] strAttr之前,这个返回的地址是有效的
wangsiyuanoo 2008-12-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 arong1234 的回复:]
如果你要返回一个char*,必须new一个,不能用临时数组
[/Quote]


char * CClientNpcDlg::AttrLongToString(const int attr)
{
char * strAttr = new char[128]; //这样么?但最后不是要delete strAttr, 还怎么返回呢?

CS_BaseCreature * pCreature = new CS_BaseCreature;

TCHAR strTemp[128] = {0};
long iATTR = pCreature->GetAttr(attr);
sprintf(strTemp, "%d", iATTR);
//tsprintf(strTemp, _T("%d"), iATTR);
strAttr = strTemp;

delete pCreature;

return strAttr;
}
arong1234 2008-12-11
  • 打赏
  • 举报
回复
如果你要返回一个char*,必须new一个,不能用临时数组
arong1234 2008-12-11
  • 打赏
  • 举报
回复
不对,你的本质还是返回一个临时数组的地址,换个变量名毫无用处,这样的地址是绝对不能返回的

[Quote=引用 5 楼 wangsiyuanoo 的回复:]
引用 1 楼 arong1234 的回复:
这和CString没什么关系

首先你应该用tsprintf吧?
其次strAttr应该定义为TCHAR strAttr[128];



C/C++ code
char * CClientNpcDlg::AttrLongToString(const int attr)
{
char * strAttr = "";

TCHAR strTemp[128] = {0};
CS_BaseCreature * pCreature = new CS_BaseCreature;
long iATTR = pCreature->GetAttr(attr);
tsprintf(strTemp, _T("%d"), …
[/Quote]
wiowei 2008-12-11
  • 打赏
  • 举报
回复
unicode用swprintf_s和TCHAR(或WCHAR)
wangsiyuanoo 2008-12-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 arong1234 的回复:]
这和CString没什么关系

首先你应该用tsprintf吧?
其次strAttr应该定义为TCHAR strAttr[128];
[/Quote]


char * CClientNpcDlg::AttrLongToString(const int attr)
{
char * strAttr = "";

TCHAR strTemp[128] = {0};
CS_BaseCreature * pCreature = new CS_BaseCreature;
long iATTR = pCreature->GetAttr(attr);
tsprintf(strTemp, _T("%d"), iATTR); //tsprintf未找到这个标识符!
strAttr = strTemp;
delete pCreature;

return strAttr; //这样返回对么?
}
GTX280 2008-12-11
  • 打赏
  • 举报
回复
顶楼上
arong1234 2008-12-11
  • 打赏
  • 举报
回复
还有strAttr是临时对象,你不能随便return
bitxinhai 2008-12-11
  • 打赏
  • 举报
回复
char strAttr[128] = {0};//这里使用TCHAR试试
arong1234 2008-12-11
  • 打赏
  • 举报
回复
这和CString没什么关系

首先你应该用tsprintf吧?
其次strAttr应该定义为TCHAR strAttr[128];

65,211

社区成员

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

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