user2129623
user2129623

Reputation: 2257

Error in C executable file

My program is up to date and works fine when I am running on Turbo C. Once I compile and run the program, executable file gets created. When I run executable file it should work, but for following program it always gives "false" answer.

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

Upvotes: 0

Views: 98

Answers (1)

simonc
simonc

Reputation: 42195

The calls to chomp are being passed arrays of uninitialised chars. The calls to strlen will then have undefined results, including very possibly reading/writing beyond the end of your buffers.

After this, you call BoyerMoore, passing in these still (at least partially) uninitialised buffers.

After this, you read pattern and target but don't do anything with them.

You don't say what the code is supposed to do but at the least I guess you need to

  • remove the calls to chomp
  • call fgets to initialise pattern and target before calling BoyerMoore

If things don't work after this, try using a debugger or adding printf statements to trace program progress.

Upvotes: 1

Related Questions