究竟错在哪里?

时间:2022-08-24 11:26:38
以下为查表法:
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,.........

#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]);
        }

#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 应是正确的,而且测试也通过

#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

#10


用这句字符型:
 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]);
      }

#14


哈哈哈,这真是一个最低级的错误:
    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,.........

#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]);
        }

#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 应是正确的,而且测试也通过

#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

#10


用这句字符型:
 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]);
      }

#14


哈哈哈,这真是一个最低级的错误:
    str2中根本就漏掉了3,3,3这三个数字,当然直接往下读4,4,4了.
    因为我把str2放在DLL中,且这些数字是由字符转换而来,没有对DLL进行仔细检查.这两天我仔细检查程序,反复测试,总感到没有错,因为这段程序本身非常简单.只得从其它地方进行检查,终于发现了这一错误(?).
害得 lovebcb(Encore,京华)朋友也跟着测试了几次.
    向 lovebcb(Encore,京华)致敬!!

#15


晕倒……

#16


我晕!!!