C-编程一个数组来存储文本文档中的单词-malloc或取消引用问题



我正试图逐字逐句地从文件中读取单词,并将它们存储在数组中。我看到我在单词之间循环得很好,但当我尝试打印数组时,它存储的不是单词,而是其他东西。我认为这个问题与内存分配或取消引用指针有关。

如果我试图删除结构节点中的*before数据,这是我通常在这样的例子中看到的,那么我得到的所有值都为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!, %sn",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!, %sn",word);
                temp = (struct node *) malloc(sizeof(struct node));
                temp->data = word;
                temp->next = head->next;
                head->next = temp;
                printf("!!!%sn",temp->data);
                //insert_front(word);
            } while (word=strtok(NULL," n"));
    }
    display();
}

void display()
{
    ptr = head;
    while(ptr->next != NULL)
    {
        ptr = ptr->next;
        printf("%sn ", ptr->data);
    }
}
temp->data = word;

使CCD_ 1指向CCD_。下次调用fgets时,string的内容将被覆盖,并且列表中的节点仍指向数组中的同一位置,该数组现在不再包含令牌。你需要复制令牌,

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

使其在循环的当前迭代之后保持不变。

当您设置word=strtok(string,"\n")时,这是有问题的,因为string是一个局部变量,strtok只会在该局部数组中给您一个指针。

尝试word = strdup(strtok(string, " n"));

更改行

temp->data = word;

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

这将用一个新指针填充节点的data项,该指针带有该单词的副本。

相关内容

  • 没有找到相关文章

最新更新