0

当我在 Turbo C 上运行时,我的程序是最新的并且运行良好。一旦我编译并运行程序,就会创建可执行文件。当我运行可执行文件时,它应该可以工作,但是对于以下程序,它总是给出“错误”的答案。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *BoyerMoore( unsigned char *data, unsigned int dataLength, unsigned char *string, unsigned int strLength )
{
    unsigned int skipTable[256], i;
    unsigned char *search;
    register unsigned char lastChar;

    if (strLength == 0)
    return NULL;

    // Initialize skip lookup table
    for (i = 0; i < 256; i++)
    skipTable[i] = strLength;

    search = string;

    // Decrease strLength here to make it an index
    i = --strLength;

    do
    {
    skipTable[*search++] = i;
    } while (i--);

    lastChar = *--search;

    // Start searching, position pointer at possible end of string.
    search = data + strLength;
    dataLength -= strLength+(strLength-1);

    while ((int)dataLength > 0 )
    {
    unsigned int skip;

    skip = skipTable[*search];
    search += skip;
    dataLength -= skip;
    skip = skipTable[*search];
    search += skip;
    dataLength -= skip;
    skip = skipTable[*search];

    if (*search != lastChar) /*if (skip > 0)*/
    {
        // Character does not match, realign string and try again
        search += skip;
        dataLength -= skip;
        continue;
    }

    // We had a match, we could be at the end of the string
    i = strLength;

    do
    {
        // Have we found the entire string?
        if (i-- == 0)
        return search;
    } while (*--search == string[i]);

    // Skip past the part of the string that we scanned already
    search += (strLength - i + 1);
    dataLength--;
    }

    // We reached the end of the data, and didn't find the string
    return NULL;
}
void chomp(char *s) {
    int n = strlen(s);
    while (n && (s[n-1]==10 || s[n-1]==13)) s[--n] = 0;
}
int main(void)
{
    char target[200];
    char *ch = target,*str;
    char pattern[20];
    int i,k,count,l;
    chomp(target);
    chomp(pattern);
    str = BoyerMoore( target, strlen(target), pattern, strlen(pattern) );
    printf("Enter the string: \n");
    fgets(target,100,stdin);
    //scanf ("%[^\n]%*c", target);
    printf("Enter the string to be matched: \n");
    fgets(pattern,20,stdin);
    //scanf ("%[^\n]%*c", pattern);


    if (str == NULL)
    puts( "String not found" );
    else
    puts( "true" );
    getch();
    return 0;
}
4

1 回答 1

1

调用chomp正在传递未初始化字符的数组。调用strlen将产生未定义的结果,包括很可能超出缓冲区末尾的读/写。

在此之后,您调用BoyerMoore,传入这些仍然(至少部分)未初始化的缓冲区。

pattern在此之后,您阅读target但不要对它们做任何事情。

你没有说代码应该做什么,但至少我猜你需要

  • 删除对chomp
  • 调用fgets初始化patterntarget调用之前BoyerMoore

如果在此之后事情不起作用,请尝试使用调试器或添加printf语句来跟踪程序进度。

于 2013-06-11T08:01:34.710 回答