我正试图逐字逐句地从文件中读取单词,并将它们存储在数组中。我看到我在单词之间循环得很好,但当我尝试打印数组时,它存储的不是单词,而是其他东西。我认为这个问题与内存分配或取消引用指针有关。
如果我试图删除结构节点中的*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
项,该指针带有该单词的副本。