c语言 - cs50 拼写器:调试时,我发现加载中的 while 循环没有执行


// Loads dictionary into memory, returning true if successful, else false
bool load(const char *dictionary)
{
// TODO
FILE* dict = fopen(dictionary,"r");
if (dict == NULL)
{
return false;
}
//initialize table
for (int i = 0; i < N; i++)
{
table[i] = NULL;
}
//char array
char word[LENGTH + 1];
//read from file
while(fscanf(dict,"%sn",word) != EOF)
{
node *new_node = malloc(sizeof(node));
/* so we know where the end of the linked list is */
new_node->next = NULL;
if(new_node == NULL)
{
printf("Couldn't malloc new noden");
fclose(dict);
return false;
}
/*hash table*/
strcpy(new_node->word , word);
hash_value = hash(word);
if(table[hash_value] == NULL)
{
table[hash_value] = new_node;
}else
{
new_node -> next = table[hash_value];
table[hash_value] = new_node;
}
word_count++;
}
fclose(dict);
return true;
}
我什么都试过了,可就是找不出毛病来。我是否错误地分配了我的文件,或者我的fscanf实现错误?我试着调试debugg50,我发现我的while循环根本没有执行。

有几个问题…

  1. 不要使用fscanf(也不要与EOF比较)
  2. cs50字典文件每行只有一个字。
  3. 先用fgets,再用strcspn去掉换行符
  4. 在检查NULL
  5. 之前,您正在解引用new_node(与new_node->next = NULL;)
  6. 如果你的hash函数不使用% N,你应该在调用者中做。
  7. 您的table设置逻辑可以简化。不需要为table[hash_value]
  8. 设置NULL

有关其他帮助,请参阅我的cs50拼写答案:cs50 pset5拼写优化

下面是清理后的代码:
// Loads dictionary into memory, returning true if successful, else false
bool
load(const char *dictionary)
{
// TODO
FILE *dict = fopen(dictionary, "r");
if (dict == NULL) {
return false;
}
//initialize table
for (int i = 0; i < N; i++) {
table[i] = NULL;
}
//char array
char word[LENGTH + 1];
//read from file
while (fgets(word,sizeof(word),dict) != NULL) {
// strip newline
word[strcspn(word,"n")] = 0;
if (new_node == NULL) {
printf("Couldn't malloc new noden");
fclose(dict);
return false;
}
// copy value into node
strcpy(new_node->word, word);
// compute the hash
hash_value = hash(word);
hash_value %= N;
new_node->next = table[hash_value];
table[hash_value] = new_node;
word_count++;
}
fclose(dict);
return true;
}

相关内容

  • 没有找到相关文章

最新更新