Hi there people,
I need a little help here with a program I made, its about finding how many pairs of anagram there are in a given input (can be from keyboard, or a text data). The number of words given are not known before EOF.
for example data.txt :
Code:
atm
mat
rat
art
spit
pits
run
will give me 4 (assuming that "run" is a pair of anagram to itself)
words are all in lowercase and no space,
here is my program :
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 33
int areAnags(char *str1, char *str2){
int i,temp;
int count1[256] = {0};
int count2[256] = {0};
if(strlen(str1) != strlen(str2)) return 0;
for(i=0;i<strlen(str1);i++){
temp = (int)str1[i];
count1[temp]++;
}
for(i=0;i<strlen(str2);i++){
temp = (int)str2[i];
count2[temp]++;
}
for(i=97;i<=122;i++){
if(count1[i] != count2[i]) return 0;
}
return 1;
}
int main(void){
char input[MAX];
int count = 0,i;
char **anagram = NULL;
anagram = malloc(sizeof(char *));
anagram[0] = malloc(MAX * sizeof(char));
if(anagram == NULL){
printf("Insufficient memory available.\n");
return EXIT_FAILURE;
}
while(scanf("%s", input) != EOF){
anagram[0] = strdup(input);
for(i=0;i<sizeof(anagram);i++){
if(areAnags(anagram[i],input) == 0){
anagram = realloc(anagram, (count+1) * sizeof(char *));
anagram[count] = malloc(MAX * sizeof(char));
if(anagram == NULL || anagram[count] == NULL){
printf("Insufficient memory available.\n");
return EXIT_FAILURE;
}
anagram[count] = strdup(input);
count++;
}
}
}
for(i=0;i<count;i++)
printf("%d\n", sizeof(anagram));
for(i=0;i<sizeof(anagram);i++)
free(anagram[i]);
free(anagram);
return 0;
}
The program compiled successfully, but when I run it, it keeps getting me a Segmentation Faullt, I am using a bit confusing pointers here, so I am not quite sure where I did the mistake..
I tried gdb, and it gave me this :
Code:
Program received signal SIGSEGV, Segmentation fault.
0xb7de7613 in strlen () from /lib/tls/i686/cmov/libc.so.6
Thanks in advance.
meriororen.