【问题标题】:How do you read a file of strings into a linked list? (C)如何将字符串文件读入链表? (C)
【发布时间】:2015-11-20 12:39:56
【问题描述】:

我的结构定义如下:

typedef struct node {
  char * word;
  int wordLength;
  int level;
  struct node * parent;
  struct node * next;
}Node;

我正在尝试创建上述结构的链接列表,其中“word”是从文件中读取的字符串。下面是我用来创建列表的函数。似乎工作正常,并将单词打印出来,但是当我尝试在main() 中打印出来时,它什么也打印不出来。

void GetWords(char * dictionary, Node * Word, Node * Start)
{
  FILE *fp;
  char * currentWord = (char *)malloc(sizeof(char));
  fp = fopen(dictionary, "r");
  ErrorCheckFile(fp);
  if(fscanf(fp, "%s", currentWord) == 1){
    Start = Word = AllocateWords(currentWord);
  }

  while((fscanf(fp, "%s", currentWord)) != EOF){
    Word->next = AllocateWords(currentWord);
    Word = Word->next;
    printf("%s: %d\n", Word->word, Word->wordLength);
  }



  fclose(fp);
}

我需要返回到列表的开头吗?如果是这样,我该怎么做?在这个函数中,我有“开始”指向文件中的第一个单词,我需要这个吗? 我正在尝试打印它们,以确保文件正确存储在列表中。

我的 main() 函数是:

int main(int argc, char ** argv)
{
  Node * Word = (Node *)malloc(sizeof(Node));
  Node * Start = (Node *)malloc(sizeof(Node));
  GetWords(argv[1], Word, &Start);


  printf("Start: %s\n", Start->word);
  printf("Word: %s\n", Word->word);
  while(Word->next != NULL){
    printf("%s\n", Word->word);
  }

  return 0;
}

打印语句只是在那里检查列表是否正在打印。就目前而言,Start->word 正在打印文件中的最后一个单词,而 Word->word 正在打印 (null),while 循环根本没有执行。

我的 AllocateWords() 函数如下:

Node * AllocateWords(char * string)
{
  Node * p;
  p = (Node *)malloc(sizeof(Node));
  if(p == NULL){
    fprintf(stderr, "ERROR: Cannot allocate space...\n\n");
    exit(1);
  }
  p->word = string;
  p->wordLength = strlen(p->word);
  p->parent = NULL;
  p->next = NULL;
  return p;
}

【问题讨论】:

  • sizeof(char) 为 1,存储字符串的空间非常小。
  • 还有WordStart是局部变量的问题。您对它们所做的更改将不会在调用 GetWords 的函数中重新显示。

标签: c string pointers linked-list file-read


【解决方案1】:

Start 指针使用按引用调用而不是按值调用。

main() 函数:

Node * Start

GetWords(..., &Start)

 void GetWords(char * dictionary, Node * Word, Node ** Start)
 {

  ....
  *Start = Word = AllocateWords(currentWord);
  ....

您还需要修复currentWord 的大小。如果最大 字长为 255 个字符,使用:

char * currentWord = (char *)malloc(256*sizeof(char));
...
if(fscanf(fp, "%255s", currentWord) == 1){
...
while((fscanf(fp, "%255s", currentWord)) != EOF){

您还需要修复 main() 函数。 您不需要分配当前字指针WordStart 节点指针。

...
Node * Word = (Node *) NULL;
Node * Start = (Node *) NULL;
GetWords(argv[1], Word, &Start);

printf("Start: %s\n", Start->word);
Word = Start;
while(Word->next){           // identical to while(World->next!=NULL){      
  Word=Word->next;
  printf("%s\n", Word->word);
}  

【讨论】:

  • 谢谢!唯一的问题是,当我在 main() 中打印出“开始”时,它指向文件中的最后一个单词,而不是第一个单词(这是我打算指向的位置)
  • @liamw9 你能列出AllocateWords 和你的输出例程吗?也许错误就在那里。
  • @liamw9 错误确实在您的主要功能中。您没有正确迭代。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 2016-10-25
  • 2017-11-01
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
相关资源
最近更新 更多