str1:
中华华人民*
str2:
1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,.........
一个汉字对映三个数字,如:"中"对映1,1,1;"华"对应2,2,2,也对映3,3,3; ......
以下程序中当x等于2时(表示有2个华字),取得的数字却是是222和444
错在哪里呢?
unsigned char rStr[3][4];
unsigned char hz[3] = {c1,c2, '\0' };//hz:需查找的汉字
int y = ((*str1).Pos((char *)hz)-1)*3
for(int i=0; i < x ;i++)
{
int k = y + i*3;
在此处加入以下三句,测试k可以正确定位:3、6:
// char s[10];
// itoa(k,s,10);
// ShowMessage(s);
rStr[i][0]=str2[k];
rStr[i][1]=str2[k+1];
rStr[i][2]=str2[k+2];
rStr[i][3]='\0';
//华字处:x=1时,取得222,x=2时取得444,真是奇怪
ShowMessage((char *)rStr[i]);
}
16 个解决方案
#1
.
#2
楼主,你这么多逗号,在程序中怎么没有看到处理啊?
1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,.........
1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,.........
#3
省略定义了,str1、str2为unsigned char 型数组
#4
帮忙,分不够另加~~~~~~~~~~~~~~~~
#5
我认为,主要是这句错了
int y = ((*str1).Pos((char *)hz)-1)*3
不是-1 ,应该是/2, 因为
AnsiString的定位,数字是从1开始记数。
111222333444555666777888
这是从0开始记数。
我改了一下程序,可能和你原有的不太一样,你参考吧:
AnsiString temp="中华华人民*";
unsigned char* str1 = temp.c_str(); //没有用上
unsigned char str2[24] = {"111222333444555666777888"};
unsigned char rStr[3][4];
AnsiString hz = "华";//hz:需查找的汉字
int y = (temp.Pos(hz)/2)*3;
int x = 2;
for(int i=0; i < x ;i++)
{
int k = y + i*3;
rStr[i][0]=str2[k];
rStr[i][1]=str2[k+1];
rStr[i][2]=str2[k+2];
rStr[i][3]='\0';
//华字处:x=1时,取得222,x=2时取得333
ShowMessage((char *)rStr[i]);
}
int y = ((*str1).Pos((char *)hz)-1)*3
不是-1 ,应该是/2, 因为
AnsiString的定位,数字是从1开始记数。
111222333444555666777888
这是从0开始记数。
我改了一下程序,可能和你原有的不太一样,你参考吧:
AnsiString temp="中华华人民*";
unsigned char* str1 = temp.c_str(); //没有用上
unsigned char str2[24] = {"111222333444555666777888"};
unsigned char rStr[3][4];
AnsiString hz = "华";//hz:需查找的汉字
int y = (temp.Pos(hz)/2)*3;
int x = 2;
for(int i=0; i < x ;i++)
{
int k = y + i*3;
rStr[i][0]=str2[k];
rStr[i][1]=str2[k+1];
rStr[i][2]=str2[k+2];
rStr[i][3]='\0';
//华字处:x=1时,取得222,x=2时取得333
ShowMessage((char *)rStr[i]);
}
#6
补充定义:
WideString str1 ="中华华人民";
unsigned char str2[15] = {11,22,333,4,55,666,777,8,99,00,111,22,333,444,555};
//str2中的数字并不一定是一位数,只是str1中的一个汉字对应str2中的三个数字
我在上述中已说了k可以正确定位,也就是说int y = ((*str1).Pos((char *)hz)-1)*3 应是正确的,而且测试也通过
WideString str1 ="中华华人民";
unsigned char str2[15] = {11,22,333,4,55,666,777,8,99,00,111,22,333,444,555};
//str2中的数字并不一定是一位数,只是str1中的一个汉字对应str2中的三个数字
我在上述中已说了k可以正确定位,也就是说int y = ((*str1).Pos((char *)hz)-1)*3 应是正确的,而且测试也通过
#7
同意:lovebcb(Encore,京华) 说的
#8
我很奇怪,楼主为什么这么喜欢用字符型数组,而不用整形数组,来表示数字?
也不喜欢用AnsiString
这样难道有什么不好吗?读起来也顺畅啊?
WideString str1 ="中华华人民";
int str2[15] = {111,222,333,444,555,666,777,888,11,22,333,4,55,666,456};
int rStr = 0;
AnsiString hz = "华";//hz:需查找的汉字
int y = str1.Pos(hz)-1;
int x = 2;
for(int i=0; i < x ;i++)
{
int k = y+i ;
rStr = str2[k];
//华字处:x=1时,取得222,x=2时取得333
ShowMessage(rStr);
}
#9
To lovebcb(Encore,京华):
感谢!
偶并不是不喜欢用整形数组.呵呵:) 其实上述字符型数组中的数字也只是一个中间环节.偶的目的是把汉字中的大量信息包含在三个数字中,最终还要转换成不同内容的字符,想省去类型转换函数,且私下认为大量的AnsiString类可能影响效率(不知观念正确),不如多用c中的表示方法好,仅此而已.
放在上面的程序已经过简化,以便明了.
请多指教:D
感谢!
偶并不是不喜欢用整形数组.呵呵:) 其实上述字符型数组中的数字也只是一个中间环节.偶的目的是把汉字中的大量信息包含在三个数字中,最终还要转换成不同内容的字符,想省去类型转换函数,且私下认为大量的AnsiString类可能影响效率(不知观念正确),不如多用c中的表示方法好,仅此而已.
放在上面的程序已经过简化,以便明了.
请多指教:D
#10
用这句字符型:
unsigned char hz[3] = {c1,c2, '\0' };
的原因,是因为程序中必须首先取得c1,c2,才能进行查表.
unsigned char hz[3] = {c1,c2, '\0' };
的原因,是因为程序中必须首先取得c1,c2,才能进行查表.
#11
至于用unsigned,是因为还要对c1,c2进行过滤
#12
帮你顶一下
#13
WideString str1 ="中华华人民";
unsigned char str2[15] = {1,1,1,2,2,2,3,3,3,4,4,4,333,444,555};
unsigned char rStr[3][4];
unsigned char hz[3] = {"华\0" };//hz:需查找的汉字
int y = ((str1).Pos((char *)hz)-1)*3;
int x = 2;
for(int i=0; i < x ;i++)
{
int k = y + i*3;
//在此处加入以下三句,测试k可以正确定位:3、6:
/*
char s[10];
itoa(k,s,10);
ShowMessage(s);
*/
rStr[i][0]=str2[k];
rStr[i][1]=str2[k+1];
rStr[i][2]=str2[k+2];
rStr[i][3]='\0';
//华字处:x=1时,取得222,x=2时取得333,没错
for(int j=0; j<3; j++) ShowMessage((int)rStr[i][j]);
}
unsigned char str2[15] = {1,1,1,2,2,2,3,3,3,4,4,4,333,444,555};
unsigned char rStr[3][4];
unsigned char hz[3] = {"华\0" };//hz:需查找的汉字
int y = ((str1).Pos((char *)hz)-1)*3;
int x = 2;
for(int i=0; i < x ;i++)
{
int k = y + i*3;
//在此处加入以下三句,测试k可以正确定位:3、6:
/*
char s[10];
itoa(k,s,10);
ShowMessage(s);
*/
rStr[i][0]=str2[k];
rStr[i][1]=str2[k+1];
rStr[i][2]=str2[k+2];
rStr[i][3]='\0';
//华字处:x=1时,取得222,x=2时取得333,没错
for(int j=0; j<3; j++) ShowMessage((int)rStr[i][j]);
}
#14
哈哈哈,这真是一个最低级的错误:
str2中根本就漏掉了3,3,3这三个数字,当然直接往下读4,4,4了.
因为我把str2放在DLL中,且这些数字是由字符转换而来,没有对DLL进行仔细检查.这两天我仔细检查程序,反复测试,总感到没有错,因为这段程序本身非常简单.只得从其它地方进行检查,终于发现了这一错误(?).
害得 lovebcb(Encore,京华)朋友也跟着测试了几次.
向 lovebcb(Encore,京华)致敬!!
str2中根本就漏掉了3,3,3这三个数字,当然直接往下读4,4,4了.
因为我把str2放在DLL中,且这些数字是由字符转换而来,没有对DLL进行仔细检查.这两天我仔细检查程序,反复测试,总感到没有错,因为这段程序本身非常简单.只得从其它地方进行检查,终于发现了这一错误(?).
害得 lovebcb(Encore,京华)朋友也跟着测试了几次.
向 lovebcb(Encore,京华)致敬!!
#15
晕倒……
#16
我晕!!!
#1
.
#2
楼主,你这么多逗号,在程序中怎么没有看到处理啊?
1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,.........
1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,.........
#3
省略定义了,str1、str2为unsigned char 型数组
#4
帮忙,分不够另加~~~~~~~~~~~~~~~~
#5
我认为,主要是这句错了
int y = ((*str1).Pos((char *)hz)-1)*3
不是-1 ,应该是/2, 因为
AnsiString的定位,数字是从1开始记数。
111222333444555666777888
这是从0开始记数。
我改了一下程序,可能和你原有的不太一样,你参考吧:
AnsiString temp="中华华人民*";
unsigned char* str1 = temp.c_str(); //没有用上
unsigned char str2[24] = {"111222333444555666777888"};
unsigned char rStr[3][4];
AnsiString hz = "华";//hz:需查找的汉字
int y = (temp.Pos(hz)/2)*3;
int x = 2;
for(int i=0; i < x ;i++)
{
int k = y + i*3;
rStr[i][0]=str2[k];
rStr[i][1]=str2[k+1];
rStr[i][2]=str2[k+2];
rStr[i][3]='\0';
//华字处:x=1时,取得222,x=2时取得333
ShowMessage((char *)rStr[i]);
}
int y = ((*str1).Pos((char *)hz)-1)*3
不是-1 ,应该是/2, 因为
AnsiString的定位,数字是从1开始记数。
111222333444555666777888
这是从0开始记数。
我改了一下程序,可能和你原有的不太一样,你参考吧:
AnsiString temp="中华华人民*";
unsigned char* str1 = temp.c_str(); //没有用上
unsigned char str2[24] = {"111222333444555666777888"};
unsigned char rStr[3][4];
AnsiString hz = "华";//hz:需查找的汉字
int y = (temp.Pos(hz)/2)*3;
int x = 2;
for(int i=0; i < x ;i++)
{
int k = y + i*3;
rStr[i][0]=str2[k];
rStr[i][1]=str2[k+1];
rStr[i][2]=str2[k+2];
rStr[i][3]='\0';
//华字处:x=1时,取得222,x=2时取得333
ShowMessage((char *)rStr[i]);
}
#6
补充定义:
WideString str1 ="中华华人民";
unsigned char str2[15] = {11,22,333,4,55,666,777,8,99,00,111,22,333,444,555};
//str2中的数字并不一定是一位数,只是str1中的一个汉字对应str2中的三个数字
我在上述中已说了k可以正确定位,也就是说int y = ((*str1).Pos((char *)hz)-1)*3 应是正确的,而且测试也通过
WideString str1 ="中华华人民";
unsigned char str2[15] = {11,22,333,4,55,666,777,8,99,00,111,22,333,444,555};
//str2中的数字并不一定是一位数,只是str1中的一个汉字对应str2中的三个数字
我在上述中已说了k可以正确定位,也就是说int y = ((*str1).Pos((char *)hz)-1)*3 应是正确的,而且测试也通过
#7
同意:lovebcb(Encore,京华) 说的
#8
我很奇怪,楼主为什么这么喜欢用字符型数组,而不用整形数组,来表示数字?
也不喜欢用AnsiString
这样难道有什么不好吗?读起来也顺畅啊?
WideString str1 ="中华华人民";
int str2[15] = {111,222,333,444,555,666,777,888,11,22,333,4,55,666,456};
int rStr = 0;
AnsiString hz = "华";//hz:需查找的汉字
int y = str1.Pos(hz)-1;
int x = 2;
for(int i=0; i < x ;i++)
{
int k = y+i ;
rStr = str2[k];
//华字处:x=1时,取得222,x=2时取得333
ShowMessage(rStr);
}
#9
To lovebcb(Encore,京华):
感谢!
偶并不是不喜欢用整形数组.呵呵:) 其实上述字符型数组中的数字也只是一个中间环节.偶的目的是把汉字中的大量信息包含在三个数字中,最终还要转换成不同内容的字符,想省去类型转换函数,且私下认为大量的AnsiString类可能影响效率(不知观念正确),不如多用c中的表示方法好,仅此而已.
放在上面的程序已经过简化,以便明了.
请多指教:D
感谢!
偶并不是不喜欢用整形数组.呵呵:) 其实上述字符型数组中的数字也只是一个中间环节.偶的目的是把汉字中的大量信息包含在三个数字中,最终还要转换成不同内容的字符,想省去类型转换函数,且私下认为大量的AnsiString类可能影响效率(不知观念正确),不如多用c中的表示方法好,仅此而已.
放在上面的程序已经过简化,以便明了.
请多指教:D
#10
用这句字符型:
unsigned char hz[3] = {c1,c2, '\0' };
的原因,是因为程序中必须首先取得c1,c2,才能进行查表.
unsigned char hz[3] = {c1,c2, '\0' };
的原因,是因为程序中必须首先取得c1,c2,才能进行查表.
#11
至于用unsigned,是因为还要对c1,c2进行过滤
#12
帮你顶一下
#13
WideString str1 ="中华华人民";
unsigned char str2[15] = {1,1,1,2,2,2,3,3,3,4,4,4,333,444,555};
unsigned char rStr[3][4];
unsigned char hz[3] = {"华\0" };//hz:需查找的汉字
int y = ((str1).Pos((char *)hz)-1)*3;
int x = 2;
for(int i=0; i < x ;i++)
{
int k = y + i*3;
//在此处加入以下三句,测试k可以正确定位:3、6:
/*
char s[10];
itoa(k,s,10);
ShowMessage(s);
*/
rStr[i][0]=str2[k];
rStr[i][1]=str2[k+1];
rStr[i][2]=str2[k+2];
rStr[i][3]='\0';
//华字处:x=1时,取得222,x=2时取得333,没错
for(int j=0; j<3; j++) ShowMessage((int)rStr[i][j]);
}
unsigned char str2[15] = {1,1,1,2,2,2,3,3,3,4,4,4,333,444,555};
unsigned char rStr[3][4];
unsigned char hz[3] = {"华\0" };//hz:需查找的汉字
int y = ((str1).Pos((char *)hz)-1)*3;
int x = 2;
for(int i=0; i < x ;i++)
{
int k = y + i*3;
//在此处加入以下三句,测试k可以正确定位:3、6:
/*
char s[10];
itoa(k,s,10);
ShowMessage(s);
*/
rStr[i][0]=str2[k];
rStr[i][1]=str2[k+1];
rStr[i][2]=str2[k+2];
rStr[i][3]='\0';
//华字处:x=1时,取得222,x=2时取得333,没错
for(int j=0; j<3; j++) ShowMessage((int)rStr[i][j]);
}
#14
哈哈哈,这真是一个最低级的错误:
str2中根本就漏掉了3,3,3这三个数字,当然直接往下读4,4,4了.
因为我把str2放在DLL中,且这些数字是由字符转换而来,没有对DLL进行仔细检查.这两天我仔细检查程序,反复测试,总感到没有错,因为这段程序本身非常简单.只得从其它地方进行检查,终于发现了这一错误(?).
害得 lovebcb(Encore,京华)朋友也跟着测试了几次.
向 lovebcb(Encore,京华)致敬!!
str2中根本就漏掉了3,3,3这三个数字,当然直接往下读4,4,4了.
因为我把str2放在DLL中,且这些数字是由字符转换而来,没有对DLL进行仔细检查.这两天我仔细检查程序,反复测试,总感到没有错,因为这段程序本身非常简单.只得从其它地方进行检查,终于发现了这一错误(?).
害得 lovebcb(Encore,京华)朋友也跟着测试了几次.
向 lovebcb(Encore,京华)致敬!!
#15
晕倒……
#16
我晕!!!