Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将文件中的单词读入c中的节点结构_C_Struct - Fatal编程技术网

将文件中的单词读入c中的节点结构

将文件中的单词读入c中的节点结构,c,struct,C,Struct,我在将word从文件读入节点结构时遇到问题。 代码如下: //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); pri

我在将word从文件读入节点结构时遇到问题。 代码如下:

//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->word
NULL
,这是为什么?

这是因为您没有为
word
分配空间。分配
节点时,只分配一个指向该单词的指针。但是,指针在分配之前保持未初始化状态。使用
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);

这是因为您没有为
单词
分配空间。分配
节点时,只分配一个指向该单词的指针。但是,指针在分配之前保持未初始化状态。使用
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);

newNode->word
只是一个指针。在实际存储数据之前,需要将内存分配给newNode->word

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

这就可以了。

newNode->word
只是一个指针。在实际存储数据之前,需要将内存分配给newNode->word

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

这应该可以做到。

新节点->单词是NUL,因为您没有为它分配内存。你需要其中之一

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


newNode->word是NUL,因为您没有为它分配内存。你需要其中之一

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


您需要为要存储的字符串分配一些空间,并将指向该空间的指针传递给scanf,或者可以使用“%ms”让scanf自行分配空间。对于后者,需要将指针传递给指针。在您的例子中是&node->word。

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

偶然的。您没有初始化它,也没有为它分配内存。您认为字符串将存储在哪里?您只为单个指针分配了足够的空间。这是偶然的。您没有初始化它,也没有为它分配内存。您认为字符串将存储在哪里?您只为单个指针分配了足够的空间。