2017-10-13 9 views
-1

私は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を新しいノードに更新するよりも、自分のパス[文字]を指すようになります。

+0

あなたの問題とは無関係ですが、あなたは 'return'が*即座に*を返すことを知っていますか? 'return'の後の同じスコープ内のコードは実行されません。これはいわゆるデッドコード*です。 'load'関数では、ファイルを開くことができない場合、あなたはそのような* dead code *を持っています。 –

+0

あなたの問題については、 'fscanf'に' word'を渡すとき、 'word'はどこを指していますか? 'fscanf'はメモリを割り当てません。 –

+0

申し訳ありませんが、コード・ポインティング・ワードを更新しました。ここに投稿するのを忘れてしまいました。char * word = NULL; –

答えて

-1

wordは、NULLポインタです。そして、fscanfは、(実際には)そのポインタがポイントするメモリを割り当てられません。だから、fscanfが参照する文字を書き込むためにwordを逆参照したい場合はどうなりますか? NULLポインタを参照解除することはできません。未定義の動作につながります。代わりに単語を配列として定義することをお勧めします。

注:コメントからの回答

関連する問題