【问题标题】:C fgets() only handling last lineC fgets() 只处理最后一行
【发布时间】:2014-02-11 01:07:48
【问题描述】:

我正在尝试编写一个接收 .txt 文件的程序,读取所有行,然后将每个单词存储到 BST 中。然后我执行一个中序遍历以按字母顺序打印单词。如果文本文件仅包含 1 行,则程序可以完美运行,但如果文本文件超过 1 行,则会出现意外结果。

示例:文本文件:

first line
second line

仅输出:

line
second

完全丢失文本文件的第一行。

我的主要方法是:

#define MAX_STR_LEN 1024
int main(int argc, char** argv)
{
  FILE *fptr;
  fptr = fopen(argv[1], "r");

  if(fptr == NULL)
  {
   printf("Error. Could not open file.\n");
   exit(1);
   }

  char line[MAX_STR_LEN];
  char* tok;
  struct BSTnode* theRoot;
  int isRoot = 1;

  while(fgets(line, MAX_STR_LEN, fptr) != NULL)
  {
    tok = strtok(line, " \n");


    while(tok != NULL)
    {
      if(isRoot == 1)
      {
        theRoot = createNode(tok); //creates the root for the BST
         isRoot = 0;
      }
      else
      {
           processStr(&theRoot, tok); //places a new word into the BST
      }

      tok = strtok(NULL, " \n");
    }

  }

  inorder(theRoot); //prints words alphabetically
  fclose(fptr);
  return 0;
}

我单步执行 GDB,当在 while 循环中第二次调用 fgets 时,BST 的根被更改并覆盖。任何建议将不胜感激。

编辑:

struct BSTnode* createNode(char* word) 
{
    struct BSTnode* temp = malloc(sizeof(struct BSTnode));
    temp->word = word;
    temp->left = NULL;
    temp->right = NULL;
    return temp;
}

void processStr(struct BSTnode** root, char* word) 
{
    struct BSTnode** node = search(root, word);
    if (*node == NULL) {
        *node = createNode(word);
    }
}

struct BSTnode** search(struct BSTnode** root, char* word) {
    struct BSTnode** node = root;
    while (*node != NULL) {
        int compare = strcasecmp(word, (*node)->word);
        if (compare < 0)
            node = &(*node)->left;
        else if (compare > 0)
            node = &(*node)->right;
        else
            break;
    }
    return node;
 }

【问题讨论】:

  • createNode()processStr() 中,您是复制了单词还是只存储了指向它的指针?
  • 这两个函数都接受一个 char* 作为参数。 struct BSTnode 包含一个 char* 字。在 createNode(char* word) 中分配了一个新节点,然后将 node->word 设置为 word(参数)。
  • 请更新您的问题并将您的createNode()processStr() 包含在其中。

标签: c file binary-search-tree fgets


【解决方案1】:

您需要在createNode() 中复制单词,尝试类似:

struct BSTnode* createNode(char* word) 
{
    struct BSTnode* temp = malloc(sizeof(struct BSTnode));
    temp->word = malloc(strlen(word) + 1);
    strcpy(temp->word, word);
    temp->left = NULL;
    temp->right = NULL;
    return temp;
}

在您的createNode() 中,word 是指向line 中子字符串的指针,再次调用fgets() 将覆盖此数组的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 2021-10-09
    • 2019-07-15
    相关资源
    最近更新 更多