1

私はここに本当に近いです。

これによりファイルが読み込まれ、gdbを使用して、テキストファイルからリンクリストに移動する単語を確認できます。

ただし、リンクリスト(コードの下部)を印刷すると、リンクリスト全体に、ファイルに複製されたファイルの最後の単語が含まれているように見えますが、ファイルには多くのエントリがあります。

bool load(const char* dictionary) {
    // open dictionary
    FILE* file = fopen(dictionary, "r");
    if (file == NULL)
        return false;

    char buf[LENGTH];

    //read the contents of the file and write to linked list
    while (!feof(file)) {
        fscanf(file,"%s", buf);

        // try to instantiate node
        node* newptr = malloc(sizeof(node));
        if (newptr == NULL) {
            return false;
        }

        // initialize node
        newptr->next = NULL;

        // add new word to linked list
        newptr->dictword = buf;

        //move node to start of linked list
        newptr->next = first;
        first = newptr;
    }

    fclose(file); 

    // traverse and print list.
    node* ptr = first;
    while (ptr != NULL) {
        printf("%s\n", ptr->dictword);
        ptr = ptr->next;
    }

    return true;
}
4

5 に答える 5

1

char buf[]すべての単語を読むことができるのは 1 つだけです。すべてのリンクされたリスト要素にそのバッファーへのポインターを保存しますが、すぐにデータを読み取ります。割り当てられた に配置するときにコピーする必要がありますnode。最も簡単な方法はnewptr->dictword = strdup(buf)、1 つのステップで割り当てとコピーを行う which を使用することです。

于 2013-02-27T23:16:54.240 に答える
0

回線に問題があります:

// add new word to linked list
newptr->dictword = buf;

このようにして、常にbufの先頭への参照をすべての要素に渡すため、「buf」を更新すると、すべての要素が更新されます。そして、それがあなたが言及された行動をしている理由です。

次のように置き換えてみてください。

newptr->dictword = (char*) malloc((strlen(buf)+1)*sizeof(char));
strcpy(newptr->dictword, buf);

「strlen(buf)+1」は、bufに格納されている現在の文字列の長さに、文字列の終わりを意味する文字「\0」のスペースを加えたものです。

PS。要素「dictword」をchar*で宣言したと仮定します。

于 2013-02-27T23:28:37.470 に答える
0

feof を使用しているということは、1. unix 環境を使用しておらず、mingw が stdin で適切に eof を実行できないことに対処する必要があることを示しています。2.考えすぎて、実際にeofをチェックする必要があります。

私は通常これを行います:

void* collection = ...;
FILE* filebehere = ...;
char buffer[1337];
while (fgets(buffer, 1337, filebehere)) {
    if (strlen(buffer) != 0) {
        buffer[strlen(buffer) - 1] = 0;
        collection_insert(collection, buffer);
    }
}
于 2013-02-27T23:25:39.263 に答える
0

dictwordのサイズがbufと同じLENGTHであると仮定します。つまり、次のようになります。

struct node {
...
...
    char dictword[LENGTH];
...
...
};

コードに次の変更を加える必要があります。

strcpy(newptr->dictword, buf);

問題は、連結リストのすべてのノードで dictword を buf と同じメモリを指すように設定していたことです。

より良い方法は、文字列にメモリを動的に割り当てることです。

struct node {
...
...
    char* dictword;
...
...
};

newptr->dictword = (char*)malloc(strlen(buf) + 1);
strcpy(newptr->dictword, buf);
于 2013-02-27T23:18:16.537 に答える
0

strdupBenJackson のソリューションをお勧めします。ただし、標準 C ライブラリには存在しません。

これが私の回避策です:

char *strdup(const char *data)
{
   char *retval = malloc(strlen(data) + 1);
   strcpy(retval, data);
   return retval;
}
于 2013-02-27T23:19:02.303 に答える