为什么这段代码在DEBUG下可以正常运行,而在RELEASE下一点按钮程序就关闭?解决方案
为什么这段代码在DEBUG下可以正常运行,而在RELEASE下一点按钮程序就关闭?
void CMy88Dlg::OnButton1()
{
char rusp[2];
char low[2];
char high[2];
int i=0;
int highchar;
int lowchar;
char run[]= "\x0a ";
char ascall[1000]={0};
CString a;
for( highchar = 0xb0; highchar <0xf8; highchar++)
{
itoa(highchar,rusp,16);
sscanf(rusp, "%x ",high);
for( lowchar=0xa1; lowchar <0xa3; lowchar++)
{
itoa(lowchar,rusp,16);
sscanf(rusp, "%x ",low);
memcpy(ascall+i,high,1);
i++;
memcpy(ascall+i,low,1);
i++;
//AfxMessageBox(ascall);
}
memcpy(ascall+i,run,1);
i++;
memcpy(ascall+i,run,1);
i++;
//CString a;
//a.Format( "lenth is %x ",highchar);
//AfxMessageBox(a);
//AfxMessageBox(ascall);
}
memcpy(ascall+i,run,1);
a.Format( "lenth is %d ",i);
AfxMessageBox(a); //TEST
return;
}
有没有什么不妥之处啊,还是环境的问题呢?多谢
------解决方案--------------------
在release下clear all 再 rebuild all试试
------解决方案--------------------
char rusp[2];
char low[2];
char high[2];
定义的字符长度太短了...后面还有一个零
------解决方案--------------------
char ascall[1000]={0};
设置为静态或全局看看。
这样可以吗?
------解决方案--------------------
cmouse: say
char rusp[2];
char low[2];
char high[2];
定义的字符长度太短了...后面还有一个零
===============================================
的确是这样的。长度太短了!改成3就可以了。
因为sscanf输入完后还有一个0在最后。。
------解决方案--------------------
定义改为
char rusp[3];
char low[4];
char high[4];
其实你都给长一些也可以比如10
ansi因为字符串的结尾都有一个 '\0 '来表示字符串的结束,
所以真正的字符串长度是\0前面的字符串长度,而不是字符数组的长度
这里rusp在进行itoa(highchar,rusp,16);这一句转化时,长度为二,所以rusp
字符数组长度至少应该长度为
sscanf(rusp, "%x ",high);或sscanf(rusp, "%x ",low);这句将high/low转化成1个字符的
字符串,high的长度感觉应该是2,但是由于这里涉及到中文字符,所以涉及到Unicode
的问题,而一个Unicode字符长度是2个char,所以这里low和high数组长度都应该是4
void CMy88Dlg::OnButton1()
{
char rusp[2];
char low[2];
char high[2];
int i=0;
int highchar;
int lowchar;
char run[]= "\x0a ";
char ascall[1000]={0};
CString a;
for( highchar = 0xb0; highchar <0xf8; highchar++)
{
itoa(highchar,rusp,16);
sscanf(rusp, "%x ",high);
for( lowchar=0xa1; lowchar <0xa3; lowchar++)
{
itoa(lowchar,rusp,16);
sscanf(rusp, "%x ",low);
memcpy(ascall+i,high,1);
i++;
memcpy(ascall+i,low,1);
i++;
//AfxMessageBox(ascall);
}
memcpy(ascall+i,run,1);
i++;
memcpy(ascall+i,run,1);
i++;
//CString a;
//a.Format( "lenth is %x ",highchar);
//AfxMessageBox(a);
//AfxMessageBox(ascall);
}
memcpy(ascall+i,run,1);
a.Format( "lenth is %d ",i);
AfxMessageBox(a); //TEST
return;
}
有没有什么不妥之处啊,还是环境的问题呢?多谢
------解决方案--------------------
在release下clear all 再 rebuild all试试
------解决方案--------------------
char rusp[2];
char low[2];
char high[2];
定义的字符长度太短了...后面还有一个零
------解决方案--------------------
char ascall[1000]={0};
设置为静态或全局看看。
这样可以吗?
------解决方案--------------------
cmouse: say
char rusp[2];
char low[2];
char high[2];
定义的字符长度太短了...后面还有一个零
===============================================
的确是这样的。长度太短了!改成3就可以了。
因为sscanf输入完后还有一个0在最后。。
------解决方案--------------------
定义改为
char rusp[3];
char low[4];
char high[4];
其实你都给长一些也可以比如10
ansi因为字符串的结尾都有一个 '\0 '来表示字符串的结束,
所以真正的字符串长度是\0前面的字符串长度,而不是字符数组的长度
这里rusp在进行itoa(highchar,rusp,16);这一句转化时,长度为二,所以rusp
字符数组长度至少应该长度为
sscanf(rusp, "%x ",high);或sscanf(rusp, "%x ",low);这句将high/low转化成1个字符的
字符串,high的长度感觉应该是2,但是由于这里涉及到中文字符,所以涉及到Unicode
的问题,而一个Unicode字符长度是2个char,所以这里low和high数组长度都应该是4