Hi~ Could you please tell me the reason I can’t pass CS50 check? It seems there is no error when I run valgrind ./speller texts/lalaland.txt (I count the nodecount q’ty during LOAD and confirmed the nodecount q’ty is 0 after UNLOAD.)
The result of valgrind and check50 are as following:
==21620== ==21620== HEAP SUMMARY:
==21620== in use at exit: 0 bytes in 0 blocks
==21620== total heap usage: 367,084 allocs, 367,084 frees, 82,227,504 bytes allocated
==21620== ==21620== All heap blocks were freed -- no leaks are possible
==21620==
==21620== For counts of detected and suppressed errors, rerun with: -v ==21620== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Helping with...
==21620== All heap blocks were freed -- no leaks are possible ...
==21620== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Looks like your program doesn't have any memory-related errors! Be sure, though, to test it with other inputs!
~/workspace/pset5/speller/ $ check50 cs50/2018/x/speller Connecting..... Authenticating....... Preparing................ Uploading............. Checking........ :) dictionary.c, dictionary.h, and Makefile exist :) speller compiles :) handles most basic words properly :) handles min length (1-char) words :) handles max length (45-char) words :) handles words with apostrophes properly :) spell-checking is case-insensitive :) handles substrings properly :( program is free of memory errors valgrind tests failed; rerun check50 with --log added to end of command for more information. See https://cs50.me/checks/6c42ab975ef6473130e4f48c1e5e74a5910dffd7 for more detail. :( program is free of memory errors valgrind tests failed; rerun check50 with --log added to end of command for more information.
Log running valgrind ./speller substring/dict substring/text... checking for output "MISSPELLED WORDS ca cats caterpill caterpillars WORDS MISSPELLED: 4 WORDS IN DICTIONARY: 2 WORDS IN TEXT: 6 "... checking that program exited with status 0... checking for valgrind errors... Conditional jump or move depends on uninitialised value(s): (file: dictionary.c, line: 33) Use of uninitialised value of size 8: (file: dictionary.c, line: 33) Conditional jump or move depends on uninitialised value(s): (file: dictionary.c, line: 60)
bool check(const char *word)
{
// TODO
int j=0; // for children[j]
int k; // for strlen(word)
node *travs=root;
for (k=0;k <= strlen(word) +1;k++)
{
if(isalpha(word[k]) || word[k]=='\'') this is line:33
{
j=tolower(word[k])-'a';
if(j==-58)
{
j=26;
}
if (travs->children[j]==NULL)
{
k=0;
travs=root;
return false;
}
else if (travs->children[j]!=NULL)
{
travs=travs->children[j];
}
} //end of if(isalpha(letter) || letter=='\'' )
if(word[k]=='\0') -- this is line: 60
{
if (travs->is_word==1)
{
return true;
k=0;
}
}
bool load(const char *dictionary)
{
root = calloc(1, sizeof(node));
FILE *inptr=fopen(dictionary,"r");
int i=0; //for children[i]
if(inptr==NULL)
{
printf("Error opening file");
return 0;
}
char letter='\0';
node *ptr=root;
do
{
letter=fgetc(inptr);
if (letter=='\n')
{
ptr-> is_word=true;
wordcount++;
ptr=root;
}
if(isalpha(letter) || letter=='\'' )
{
i = tolower(letter) - 'a';
if (i==-58) //ASCII code of '\'' - 'a'
{
i=26;
}
//check children[i]’s value, if the value in children[i] is NULL, calloc a new node, then let children[i] point to it
if(ptr->children[i]==NULL)
{
ptr->children[i] = calloc(1, sizeof(node));
nodecount++;
ptr=ptr->children[i];
}
else if (ptr->children[i]!=NULL)
{
ptr=ptr->children[i];
}
} // end of if(isalpha(letter) || letter=='\'' )
} // end of do
while (letter != EOF);
fclose(inptr);
return true;
} // end of bool load(const char *dictionary)
load
.