0

ファイルから単語を単語ごとに読み取り、それらを配列に格納しようとしています。単語をうまくループしていることがわかりますが、配列を印刷しようとすると、格納されているのは単語ではなく、別のものです。この問題は、メモリ割り当てまたはポインターの逆参照に関連していると思います。

このような例で通常見られるように、構造体ノードのデータの前に * を削除しようとすると、すべての値に対して null が返されます。何が間違っている可能性があるかについて誰か考えがありますか? 私は C に非常に慣れていないので、コードがおそらくそれほど優れていないことを理解しています。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct node
{
    struct node *next;
    char *data;
};

struct node *head, *ptr, *temp;

void display();
void words(char filename[]);

int main(void)
{
    char fname[99];

    head = (struct node *)malloc(sizeof(struct node));

    head->data = NULL;
    head->next = NULL;

        printf("\nEnter file name: \n");
    scanf("%s", fname);
    words(fname);
    return 0;

}



void words(char filename[]){
    printf("o hi!, %s\n",filename);
    //open the file
    FILE *file = fopen(filename, "r");
    char *word;
    char string[50];
    while (fgets(string,50,file)){
        word=strtok(string, " \n");
            do {
                printf("Oh hi!, %s\n",word);

                temp = (struct node *) malloc(sizeof(struct node));
                temp->data = word;
                temp->next = head->next;
                head->next = temp;

                printf("!!!%s\n",temp->data);
                //insert_front(word);
            } while (word=strtok(NULL," \n"));
    }
    display();
}


void display()
{
    ptr = head;
    while(ptr->next != NULL)
    {
        ptr = ptr->next;
        printf("%s\n ", ptr->data);
    }
}
4

3 に答える 3

1
temp->data = word;

配列temp->dataを指すことができます。次回string呼び出すと、 の内容が上書きされ、リスト内のノードは配列内の同じ場所を指し続け、トークンが含まれなくなります。トークンをコピーする必要があります。fgetsstring

temp->data = malloc(strlen(word) + 1);
strcpy(temp->data,word);

ループの現在の反復を超えて持続させるため。

于 2013-02-08T16:51:36.983 に答える
1

string はローカル変数であり、 strtok はそのローカル配列内のポインターを提供するだけなので、問題のある word = strtok(string, "\n") を設定している場合。

試すword = strdup(strtok(string, " \n"));

于 2013-02-08T16:51:53.340 に答える
0

行を変更する

temp->data = word;

temp->data = strdup(word); /* Or use malloc and strcpy if it is not implemented on your platform*/

dataこれにより、ノードの項目が単語へのコピーを持つ新しいポインターで埋められます。

于 2013-02-08T16:52:05.817 に答える