首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

BYTE数组里查寻是否含有某个字符串

2013-04-20 
BYTE数组里查找是否含有某个字符串?假如:BYTE test[1024*4]test[0] 0test[1] 0...test[100] 17

BYTE数组里查找是否含有某个字符串?
假如:
  BYTE = test[1024*4];
  test[0] = 0;
  test[1] = 0;
   .
   .
   .
  test[100] = 179;
  test[101] = 175;
  test[102] = 207;
  test[103] = 202;
   .
   .//其他值及0
   .
  char test1[256];
  memset(test1,0,sizeof(test1));
  test1[0] = 179;
  test1[1] = 175;
  test1[2] = 207;
  test1[3] = 202;

  如何知道test数组里是否含有test1字符串?
  test数组里含有0。一个比较笨的方法是通过循环查找,还有其它的效率更高的方法吗?
[解决办法]
不知道字符串的动态规划算法能不能符合你的要求,这个算法也是查找子字符串的
我只知道有这个算法,其他的不懂。。LCS算法
[解决办法]
KMP???
[解决办法]
用什么算法也避不开循环吧?
[解决办法]
char类型范围溢出了,所以是找不到了,将char改为BYTE再查找,循环也不慢啊,在循环中将test[i]和test1[0]做比较,相同的话再使用memcpy来直接比较,示例代码如下:

int findSub(BYTE *pSrc ,int nSrcLen,BYTE *pSub ,int nSubLen)
{
    for (int i = 0; i != nSrcLen-nSubLen ;++i)
    {
        if (pSrc[i] == pSub[0])
        {
            if (memcmp(pSrc+i ,pSub ,nSubLen) == 0)
            {
                return i;
            }
        } 
    }
    return -1;
}


int main()
{
    BYTE  test[1024*4];
    test[0] = 0;
    test[1] = 0;
    test[10] = 179;
    test[11] = 175;
    test[12] = 207;
    test[13] = 202;

    BYTE test1[256];
    memset(test1,0,sizeof(test1));
    test1[0] = 179;
    test1[1] = 175;
    test1[2] = 207;
    test1[3] = 202;

    int n = findSub(test ,1024*4 ,test1 ,4);
    if(n != -1)
        printf("test在位置%d处包含test1\n " ,n) ;
    else
        printf( "test中不包含test1\n" );
    return 0;
}

[解决办法]
用字符串完全类似的匹配算法,KMP最为合适,可以参考http://billhoo.blog.51cto.com/2337751/411486这篇文章,字符串有结束符'\0',BYTE数组有长度信息。
[解决办法]
当然KMP~
------解决方案--------------------


以下代码片断仅供参考:

            case 'F':
                gotoxy(1,49);
                cprintf("Find:");
                gets(fstr);
                if (fstr[0]==39) {
                    lenf=strlen(fstr)-1;
                    for (j=0;j<lenf;j++) {
                        if (fstr[j+1]=='?') bw[j]=1;
                        else {
                            bw[j]=0;
                            bf[j]=fstr[j+1];
                        }
                    }
                } else {
                    i=0;
                    for (j=0;j<40;j++) {
                        if (fstr[i]==0x0D
[解决办法]
fstr[i]==0x0A
[解决办法]
fstr[i]==0x1A
[解决办法]
fstr[i]==0) {
                            fstr[i]=0;
                            break;
                        }
                        while (fstr[i]==' '
[解决办法]
fstr[i]==9) {
                            fstr[i]=0;
                            i++;
                        }


                        ag[j]=fstr+i;
                        while (fstr[i]!=9&&fstr[i]!=' '&&fstr[i]!=0x0D&&fstr[i]!=0x0A&&fstr[i]!=0x00) i++;
                    }
                    lenf=j;
                    for (i=0;i<lenf;i++) {
                        if (isxdigit(ag[i][0])) {
                            bw[i]=0;
                            sscanf(ag[i],"%2x",&bf[i]);
                        } else {
                            bw[i]=1;
                        }
                    }
                }
                bf[lenf]=0;
                find=1;
                off=offset;
                fseek(f,off,SEEK_SET);
                for (i=0;i<lenf;i++) {
                    bb[i]=fgetc(f);
                }
                if (feof(f)) {
                    gotoxy(1,49);
                    cprintf("%s Not find",bf);
                    getch();
                    mygotoxy(0,0);
                    break;
                }
                while (1) {
                    match=1;


                    for (j=0;j<lenf;j++) {
                        if (bw[j]==0&&bf[j]==bb[j]) continue;
                        if (bw[j]==1) continue;
                        match=0;
                        break;
                    }
                    if (match==1) {
                        offset=off;
                        mygotoxy(0,0);
                        if (yy==0) {
                            if (offset>=16) offset-=16;
                        } else {
                            mygotoxy(xx,yy-1);
                        }
                        dump(offset);
                        if (offset+(yy+1)*16+xx<length) {
                            if (yy==47) {
                                if (offset<length-0x300L) offset+=16;
                            } else {
                                mygotoxy(xx,yy+1);
                            }
                        }
                        dump(offset);
                        break;


                    } else {
                        memmove(bb,bb+1,lenf-1);
                        bb[lenf-1]=fgetc(f);
                        if (feof(f)) {
                            gotoxy(1,49);
                            cprintf("%s Not find",bf);
                            getch();
                            mygotoxy(0,0);
                            break;
                        }
                        off++;
                    }
                }
            break;
            case 'N':
                if (find!=0) {
                    off=offset+lenf+16;
                    fseek(f,off,SEEK_SET);
                    for (i=0;i<lenf;i++) {
                        bb[i]=fgetc(f);
                    }
                    if (feof(f)) {
                        gotoxy(1,49);
                        cprintf("%s Not find",bf);
                        getch();
                        mygotoxy(0,0);
                        break;


                    }
                    while (1) {
                        match=1;
                        for (j=0;j<lenf;j++) {
                            if (bw[j]==0&&bf[j]==bb[j]) continue;
                            if (bw[j]==1) continue;
                            match=0;
                            break;
                        }
                        if (match==1) {
                            offset=off;
                            mygotoxy(0,0);
                            if (yy==0) {
                                if (offset>=16) offset-=16;
                            } else {
                                mygotoxy(xx,yy-1);
                            }
                            dump(offset);
                            if (offset+(yy+1)*16+xx<length) {
                                if (yy==47) {
                                    if (offset<length-0x300L) offset+=16;
                                } else {


                                    mygotoxy(xx,yy+1);
                                }
                            }
                            dump(offset);
                            break;
                        } else {
                            memmove(bb,bb+1,lenf-1);
                            bb[lenf-1]=fgetc(f);
                            if (feof(f)) {
                                gotoxy(1,49);
                                cprintf("%s Not find",bf);
                                getch();
                                mygotoxy(0,0);
                                break;
                            }
                            off++;
                        }
                    }
                }
            break;

热点排行