CS50 pset5加载功能

时间:2016-07-13 10:32:52

标签: c load trie cs50

我在CS50的pset5的加载部分遇到了一些问题,如果有人可以帮忙的话会很棒。我正在尝试加载从字典中读取的trie(下面的文件fp),然后遍历字母以创建trie。

我理解构建特里结构的概念,但我认为我遗漏了结构指针的设置方式(希望我不会因为下面的代码而偏离轨道)。我试图设置'陷阱'来浏览试验的每个阶段。

我目前遇到了分段错误,所以不完全确定下一步该去哪里。任何帮助都会受到大力赞赏。

/** 
* Loads dictionary into memory.  Returns true if successful else false.
*/
bool load(const char* dictionary)
{
    //create word node and set root

    typedef struct node {
        bool is_word;
        struct node* children[27];
    } node;

    node* root = calloc(1, sizeof(root));
    root -> is_word = false;
    node* trav = root;

    //open small dictionary

    FILE* fp = fopen(dictionary, "r");
    if (fp == NULL)
    {
        printf("Could not open %s.\n", dictionary);
        return false;
    } 

    //read characters one by one and write them to the trie

        for (int c = fgetc(fp); c != EOF; c = fgetc(fp))
        {

            //set index using to lower.  Use a-1 to set ' to 0 and other letters 1-27

            int index = tolower(c)-('a'-1);

            //if new line (so end of word) set is_word to true and return trav to root)

            if (index == '\n')
            {
                trav->is_word = true;
                trav = root;
            }

            //if trav-> children is NULL then create a new node assign to next
            //and move trav to that position

            if (trav->children[index] == NULL)
            {
                node* next = calloc(1, sizeof(node));
                trav->children[index] = next;
                trav = next;
            }

            //else pointer must exist so move trav straight on

            else {
                trav = trav->children[index];
            }

    }

    fclose(fp);

    return false;
}

1 个答案:

答案 0 :(得分:0)

我假设你设置数组children[]的大小来存储26个字母加上撇号。如果是这样,当fgetc(fp)返回acsii代码为39的撇号(我认为)时,index将设置为-57,这绝对不是trav->children的一部分。这可能是你获得segfault(或至少其中一个地方)的地方

希望这有帮助。