| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1682 人关注过本帖
标题:求助:字符串赋值出错
只看楼主 加入收藏
Scofield
Rank: 1
等 级:新手上路
威 望:1
帖 子:56
专家分:0
注 册:2006-5-30
收藏
 问题点数:0 回复次数:9 
求助:字符串赋值出错

主要过程如下:
...
CString str1="5.2";

memcpy( &info.data, str1, strlen(str1)); //data为BYTE类型,在类info中定义时为BYTE data[8];

for( int i = strlen(str1); i<8; i++)
{
info.data[i] = '0'; //余下部分补0
}

CString s=info.data; //得到s="5.200000烫?.2" ,不知道为什么不是"5.200000"?而且奇怪的是后面多余的部分 "?.2与" str1 值有关,比如若

//str1="54.7",则s="54.70000烫?4.7",希望得到高手解惑,谢谢!

搜索更多相关主题的帖子: 赋值 字符 data info 
2006-07-20 11:29
cz522321
Rank: 1
等 级:禁止访问
威 望:2
帖 子:569
专家分:5
注 册:2006-3-13
收藏
得分:0 
info应该是对象吧?你的问题都说的不太明白!你把整个代码传上来,那样才可能完整的弄明白!

2006-07-20 22:44
Scofield
Rank: 1
等 级:新手上路
威 望:1
帖 子:56
专家分:0
注 册:2006-5-30
收藏
得分:0 

对,是类的对象:
...
char FileData[8] = "";
while(InFile >> FileData) //FileData直接从文件中获取字符
{
m_SendData=FileData; //m_SendData为CString型

for(int i=strlen(m_SendData);i<7;i++)
{
info.Data[i]='0';
}
info.Data[7]='\0';
........
str="数据:"; //CString str,tmpstr;
for(int j=0;j<7;j++)
{
tmpstr=info.Data[j];
str+=tmpstr;
}
box->InsertString(box->GetCount(),str);

//不知道为什么输出的数据后面总是带有乱码字符,比如FileData="5.2"时,结果显示的却是"5.2 **"(*代表乱码).谢谢了!


2006-07-21 19:21
Scofield
Rank: 1
等 级:新手上路
威 望:1
帖 子:56
专家分:0
注 册:2006-5-30
收藏
得分:0 
//Data为BYTE类型,在类info中定义时
为BYTE data[8];

2006-07-21 19:25
热情依然
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:22
帖 子:715
专家分:0
注 册:2005-4-5
收藏
得分:0 
估计是类型不兼容,你将BYTE换成TCHAR,因为CString里面每个元素都是TCHAR类型的,因为TCHAR是一位,你那个BYTE是8位,那样的话  BYTY[8]就相当于 64位,而  TCHAR[8]是8位,刚好符合你的要求

[此贴子已经被作者于2006-7-22 8:30:45编辑过]



c++/C + 汇编 = 天下无敌
2006-07-22 08:28
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
收藏
得分:0 
for( int i = strlen(str1); i<7; i++)
{
info.data[i] = '0'; //余下部分补0
}
info.data[i]='\0';
晕,这是很常见的没有给字符串赋结束符的现象,由于你没有给字符串赋结束符,在用info.data这个字符串的时候会再往后直到碰到结束符才结束,所以才会出现不该出现的乱码等
上面的代码或者可以改为BYTE data[9];然后在for循环中将i<8,最后一个结束符赋值语句还是要的

世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-07-22 08:58
Scofield
Rank: 1
等 级:新手上路
威 望:1
帖 子:56
专家分:0
注 册:2006-5-30
收藏
得分:0 

谢谢,不过Data定义为BYTE类型是在dll中被定义的,我只是调用,dll里面的东西自己不好修改吧?
...
char FileData[8] = "";
while(InFile >> FileData) //FileData直接从文件中获取字符
{
m_SendData=FileData; //m_SendData为CString型

for(int i=strlen(m_SendData);i<7;i++)
{
info.Data[i]='0';
}
info.Data[7]='\0'; //////(*)
........
str="数据:"; //CString str,tmpstr;
for(int j=0;j<7;j++)
{
tmpstr=info.Data[j];
str+=tmpstr;
}
box->InsertString(box->GetCount(),str);//////(**)

另外我在(*)和(**)两处加了断点发现,info.Data在(*)处正常,即为“5.20000”,而到了(**)处却为“5.2×××5.2”,其中只有前三位正常:info.Data【0】=‘5’,info.Data【1】=‘.’,info.Data【2】=‘2’,其余字节均为'?',不知道错在什么地方了呢?
注:(*)和(**)之间的省略号处没有对该数据进行操作


2006-07-22 09:09
Scofield
Rank: 1
等 级:新手上路
威 望:1
帖 子:56
专家分:0
注 册:2006-5-30
收藏
得分:0 
嗯,6楼的兄弟说的对,刚开始确实忘了,不过后来加了后(*)处的info.Data显示的结果就正常了,不过到了(**)处却发现数据末尾又出现乱码了


2006-07-22 09:13
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
收藏
得分:0 
info.Data[7]='\0'; //////(*)
........
str="数据:"; //CString str,tmpstr;
中间的.......的代码你没有贴出来,有可能中间的代码修改了Data的数据,或者你这是多线程程序,在这个过程中其它线程修改了Data的数据,
另外
[CODE] str="数据:"; //CString str,tmpstr;
for(int j=0;j<7;j++)
{
tmpstr=info.Data[j];
str+=tmpstr;
}[/CODE]
可以修改为:
[CODE] str="数据:"; //CString str,tmpstr;
str+=info.Data;[/CODE]
CString支持与字符串之间的+、=等操作

世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-07-22 09:59
Scofield
Rank: 1
等 级:新手上路
威 望:1
帖 子:56
专家分:0
注 册:2006-5-30
收藏
得分:0 

嗯,是这样的:

char FileData[8] = "";

while(InFile >> FileData) ////////////////FileData直接从文件中获取字符
{
m_SendData=FileData;
VCI_CAN_OBJ info;
memcpy(&info.Data,m_SendData,strlen(m_SendData));

for(int i=strlen(m_SendData);i<8;i++)
{
info.Data[i]='\0';
} ///(*)
if(VCI_Transmit(m_devtype,m_devind,m_cannum0,&info,1)==1)
{ //VCI_Transmit(设备类型号,设备索引号,第0路CAN发送,要发送的数据帧的首指针,发送数据的长度)

ShowInfo("通道0发送成功",0);

}
if(VCI_Receive(m_devtype,m_devind,m_cannum1,&info,1)==1) //第1路CAN接收
{
CNewDlg *dlg=this;
CListBox *box=(CListBox *)dlg->GetDlgItem(IDC_LIST_INFO);
CString str,tmpstr;

str="数据:";
tmpstr=info.Data;
str+=tmpstr;

box->InsertString(box->GetCount(),str);
box->SetCurSel(box->GetCount()-1); //(**)

ShowInfo("通道1接收成功",0);
}
else
{
ShowInfo("发送失败",2);
}
}

不知道原因在哪里呢?

[此贴子已经被作者于2006-7-22 11:16:39编辑过]


2006-07-22 11:12
快速回复:求助:字符串赋值出错
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021124 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved