I have two fairly large 2d arrays to hold strings, and I want to compare each string in the second array to every string in the first to see if any match. The following is how I create the arrays, and how I compare them. It works if x(which is unsigned long b/c max number can be 4000000000) is a small number, but when it is a large number( 500000+ ), the programs seg faults at strcmp. Any ideas?
Code:
unsigned long int x;
int y;
printf( "Enter the number of random words to be produced: " );
scanf( "%u", &x );
printf( "Enter the maximum length of each word: " );
scanf( "%d", &y);
char **buffer;
buffer = malloc( x * sizeof(char *) + 1);
for( i=0; i<x; i++) {
buffer[i] = malloc( y * sizeof(char) + 1 );
}
// Generate random words and store in a 2d buffer array.
// rand()%25 ensures only letters are generated.
for( i=0; i<x; i++ ) {
for( j=0; j<y-1; j++ ) {
r = rand()%25;
buffer[i][j] = letters[r];
}
// Ensure each string is null-terminated.
buffer[i][j] = '\0';
}
FILE *dict;
dict = fopen( "linux.words", "r" );
if( ! dict ) {
printf( "Error: Failed to open linux.words\n" );
}
char dict_words[SIZE][WORD_SIZE], *z;
i = 0;
while( fgets( dict_words[i], 256, dict ) != NULL ) {
i++;
}
// Remove newline character from each word to avoid comparison errors later.
int p, len;
for( p=0; p<i; p++ ) {
if(( z = strchr( dict_words[p], '\n' ) )) *z = 0;
}
// Ensures all words in linux.words start with lower case letter.
for( p=0; p<i; p++ ) {
dict_words[p][0] = tolower( dict_words[p][0] );
}
}
int k;
for( j=0; j<i; j++ ) {
for( k=0; k<x; k++ ) {
if( strcmp( dict_words[j], buffer[k] ) == 0 ) {
fputs( buffer[k], words_out);
fputs( "\n", words_out);
}
}
}