从文件中读取单词到c中的节点结构

时间:2014-10-21 16:18:00

标签: c struct

我在将文件中的单词读入节点结构时遇到了麻烦。 这是代码:

//open file
FILE* fp = fopen("fp", "r");

//create node structure
typedef struct node  
{
      char* word;
      struct node* next;
} node;

node* newNode = malloc(sizeof(node));

fscanf(fp, "%s", newNode->word);

printf("w: %s\n", newNode->word);

fp文件看起来像这样

word1
word2
word3
word4

newNode->wordNULL,为什么会这样?

4 个答案:

答案 0 :(得分:3)

这是因为您没有为word分配空间。分配node时,只会分配指向该单词的指针。但是,指针保持未初始化状态,直到您指定它为止。使用fscanf读取它是未定义的行为,因为它背后没有内存。

处理它的一种方法如下:分配一个固定大小的临时缓冲区,大小足以容纳最大的单词,读入单词,然后为字符串分配空间,复制内容,并设置指针进入节点:

char buf[100];
...
fscanf(fp, "%99s", buf); // 99, not 100, because '\0' must fit in the buf as well
int len = strlen(buf);
newNode->word = malloc(len+1); // +1 for null terminator
strcpy(newNode->word, buf);

答案 1 :(得分:1)

newNode->word只是一个指针。在将数据存储到其中之前,您需要将内存分配给newNode-> word!

node* newNode = malloc(sizeof(node));
newNode->word = (char*) malloc(sizeof(char)*10);
fscanf(fp, "%s", newNode->word);

这种糟糕的伎俩。

答案 2 :(得分:1)

newNode->字是NUL,因为你没有为它分配内存。你需要

typedef struct node  
{
      char word[100];  // maximum word length 99
      struct node* next;
} node;

node* newNode = malloc(sizeof(node));
newNode->word = malloc(100);    // allocate space for word

答案 3 :(得分:-1)

您需要为要存储的字符串分配一些空间,并将指向该空间的指针传递给scanf,或者您可以使用"%ms"让scanf自己分配空间。对于后者,您需要将指针传递给指针。在你的情况下,这将是& node-> word。