I've been running the code with the small dictionary and a sample text of "cat hgsgk caterpillar", so the code should theoretically return a wordcount of 3, and hgsgk as the only misspelled word. However, the code I have currently outputs a wordcount of 2, and lists "cat" and "hgsgk" as the misspelled words. I have been checking my code over and over, and I really have no idea what's wrong! I think it's an issue with my check function, but there may also be a problem with the load function.
// Global variables
node *first;
int wordcount = 0;
// Returns true if word is in dictionary else false
bool check(const char *word)
{
// Create ptr to search through dictionary
node *ptr = first;
// Iterate through each letter, use ptr to follow path in dictionary
for (int i = 0; i < strlen(word); i++)
{
// Find numerical value for i
int value;
if (islower(word[i]))
{
value = word[i] - 'a';
}
else if (isupper(word[i]))
{
value = word[i] - 'A';
}
else
{
// Assume if not upper or lower, must be apostrophe
value = 26;
}
// If end of word, check if is in dictionary
if (i == (strlen(word) - 1))
{
if (ptr->is_word)
{
return true;
}
else
{
return false;
}
}
// Otherwise, check if links to next letter
else if (ptr->children[value])
{
ptr = ptr->children[value];
}
else
{
return false;
}
}
// Return false if error
return false;
}
// Loads dictionary into memory, returning true if successful else false
bool load(const char *dictionary)
{
// Creates root of trie
first = calloc(1, sizeof(node));
if (!first)
{
return false;
}
// Create ptr, set equal to first
node *ptr = first;
// Opens dictionary
FILE *opened = fopen(dictionary, "r");
if (opened == NULL)
{
return false;
}
// Add each character to trie or marks end of word
for (int i = fgetc(opened); i != EOF; i = fgetc(opened))
{
// Checks for end of word
if (!isspace(i))
{
// Find numerical value for i
int value;
if (islower(i))
{
value = i - 'a';
}
else if (isupper(i))
{
value = i - 'A';
}
else
{
// Assume if not upper or lower, must be apostrophe
value = 26;
}
// Goes to corresponding pointer in children array and creates new node if necessary
if (ptr->children[value] == NULL)
{
node *next_letter = calloc(1, sizeof(node));
ptr->children[value] = next_letter;
// Check next letter was successful
if (!next_letter)
{
return false;
}
}
// Move pointer to next node
ptr = ptr->children[value];
}
else
{
// Indicate end of word
ptr->is_word = true;
// Increase wordcount
wordcount++;
// Return ptr to beginning
ptr = first;
}
}
// Close file, and report success!
fclose(opened);
return true;
}
// Returns number of words in dictionary if loaded else 0 if not yet loaded
unsigned int size(void)
{
return wordcount;
}