私はpset5に問題がありますが、実際にデバッグを開始する方法はわかりません。私はレッスンを数回見ましたが、どこにも行きません。トライを使用したロードのPset5実装
私はそれは私にワンセグ障害を与えているspeller.cを実行すると、私は、デバッガを実行し、それがForループのbegginingでクラッシュし、ここに私のコードを、次のとおりです。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <ctype.h>
#include <string.h>
#include "dictionary.h"
// default dictionary
#define DICTIONARY "dictionaries/large"
//created the struct node
typedef struct node
{
bool is_word;
struct node * paths[27];
}
node;
int letter = 0;
char * word = NULL;
/**
* Returns true if word is in dictionary else false.
*/
bool check(const char *word)
{
//todo
return false;
}
/**
* Loads dictionary into memory. Returns true if successful else false.
*/
bool load(const char *dictionary)
{
//opens dictionary for reading
FILE *fp = fopen(DICTIONARY, "r");
if (fp == NULL)
{
return false;
unload();
}
//creates the root of the trie
node *root = malloc(sizeof(node));
root -> is_word = false;
node * trav = root;
char * word = NULL;
//start reading the file
while (fscanf(fp, "%s", word) != EOF)
{
for (int i = 0; i < strlen(word); i++)
{
//assing wich path to take
char c = fgetc(fp);
if (isupper(c))
{
letter = tolower (c);
letter = letter -'a';
}
else if (isalpha(c))
{
letter = c;
letter = letter -'a';
}
else if (c == '\'')
{
letter = 26;
}
else if (c == '\0')
{
trav -> is_word = true;
}
if (trav -> paths[letter] == NULL)
{
node *new_node = malloc(sizeof(node));
if (new_node == NULL)
{
return false;
unload();
}
//point to new node
trav -> paths[letter] = new_node;
}
else
{
trav = trav -> paths[letter];
}
}
}
if (fscanf(fp, "%s", word) == EOF)
{
fclose(fp);
return true;
}
return false;
}
/**
* Returns number of words in dictionary if loaded else 0 if not yet loaded.
*/
unsigned int size(void)
{
// TODO
return 0;
}
/**
* Unloads dictionary from memory. Returns true if successful else false.
*/
bool unload(void)
{
// TODO
return false;
}
私も知りませんnew_nodeを次の新しいノードに向ける方法と、それらの名前が異なる必要がある場合。例えば、私は "foo"という単語を保存するつもりです。travというノードを読み、パス[5](f文字)に行き、既に開いていないかどうかをチェックします(NULLの場合) new_nodeというノードを作成し、trav - > paths [5]をポイントすると、travを新しいノードに更新するよりも、自分のパス[文字]を指すようになります。
あなたの問題とは無関係ですが、あなたは 'return'が*即座に*を返すことを知っていますか? 'return'の後の同じスコープ内のコードは実行されません。これはいわゆるデッドコード*です。 'load'関数では、ファイルを開くことができない場合、あなたはそのような* dead code *を持っています。 –
あなたの問題については、 'fscanf'に' word'を渡すとき、 'word'はどこを指していますか? 'fscanf'はメモリを割り当てません。 –
申し訳ありませんが、コード・ポインティング・ワードを更新しました。ここに投稿するのを忘れてしまいました。char * word = NULL; –