Reputation: 2257
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
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
chomp
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