如何从标准输入中读取多行并将其存储在链接列表中

BeginnerCoder

我正在尝试编写一个从用户(从STDIN)获取行并将其存储在链接列表中的程序。

现在我只得到一行并终止程序。如何更改代码以保持从stdin获取行?

另外,如果有人可以告诉我是否要分配和释放内存,那将非常有帮助。

谢谢。

#include <stdio.h>
#include <stdlib.h>

int BUFF_SIZE = 128;

struct Node {
    char* data;
    struct Node* next;
};

struct Node* head = NULL;
struct Node* tail = NULL;

void free_list(struct Node* head)
{
    if (head != NULL)
    {
        free_list(head->next);
        free(head);
    }
}

int main()
{
    int curr_size = 0;

    char* pStr = malloc(BUFF_SIZE);
    curr_size = BUFF_SIZE;

    printf("%s", "please print multiple lines\n");
    if (pStr != NULL)
    {
        char c;
        int i = 0;

        while ((c = getchar()) != '\n' && c != EOF)
        {
            pStr[i++] = c;

            if (i == curr_size)
            {
                curr_size = i + BUFF_SIZE;
                pStr = realloc(pStr, curr_size);
                if (pStr == NULL) return;
            }
        }
        pStr[i] = '\0';

        struct Node* new_node = malloc(sizeof(struct Node*));
        char* new_data = malloc(sizeof(pStr));
        new_data = pStr;
        new_node->data = new_data;

        if (head == NULL)
        {
            head = new_node;
            tail = new_node;
        }

        else
        {
            tail->next = new_node;
        }
    }

    free_list(head);
}
基兰·比拉达(kiran biradar)

几个问题:

  1. 截止到现在,您正在终止收货时终止阅读\n

    if (pStr == NULL) return; //error
    
    int c;
    int i = 0;
    
    while ((c = getchar()) != EOF)
    {
       /*New word, insert into linked list*/
       if (c == '\n'){
           pStr[i] = '\0';
    
           struct Node* new_node = malloc(sizeof(*new_node));
           char* new_data = malloc(i+1);
           strcpy(new_data, pStr);
           new_node->data = new_data;
    
           if (head == NULL)
           {
                head = new_node;
                tail = new_node;
           }
           else
           {
                tail->next = new_node;
                tail = new_node;
           }
           i = 0; //Reset the index
       }
       else {
    
           pStr[i++] = c;
           if (i == curr_size)
           {
               curr_size = i + BUFF_SIZE;
               pStr = realloc(pStr, curr_size);
               if (pStr == NULL) return;
           }
       }
    }
    
  2. 内存泄漏和节点data将始终指向的最新内容pStr

    char* new_data = malloc(sizeof(pStr)); 
    new_data = pStr;   //Memory leak here
    new_node->data = new_data;
    

    更改为

    char* new_data = malloc(i+1);
    strcpy(new_data, pStr);
    new_node->data = new_data;
    

    sizeof(pStr)是指针的大小,而不是字符串的长度。

  3. tail每个节点插入列表后,您需要更新

     else
     {
         tail->next = new_node;
     }
    

     else
    {
        tail->next = new_node;
        tail = new_node;
     }
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何读取txt并将其数据存储在列表中?

如何读取文件并将其数据存储到列表中?

如何存储来自用户的多行输入并将其打印在单独的行中?

从文件中读取数据并将其存储在列表Python中

读取输入并将其存储在数组中的问题

Groovy 逐行读取文件并将其存储到列表中

如何从文件中读取信息并将信息存储在链接列表(Java)中?

如何使用C#读取此文本文件并将其存储在列表中

如何读取字符串数据并只从中获取数字并将其存储在列表中

在J中读取多行标准输入

如何从文件读取并将其存储在对象的ArrayList中?

如何读取多维数组并将其存储在指针中

如何读取输入并将其保存到文件中

如何获取输入并将其放入字典中的列表中

如何获取用户输入并将其存储在向量中?

从Excel文件列中读取列表列表并将其存储在python列表中

在python中解析大型文件的多行,并将其存储在列表中

读取整个文件并将其存储在列表中,而不会丢失将其拆分的内容

Java:如何从扫描仪读取多个由空格和逗号分隔的输入并将其存储在变量中?

在shell脚本中读取输入文件并将其行存储在变量中

如何从文件中读取多行并将其拆分为php中的数组

如何使用换行符读取字符串并将其存储到Pandas数据框或python列表中

如何从多行 PostgreSQL ResultSet 中获取一行并将其存储在 Java 中?

从文本文件中读取值并将其存储到列表中

如何比较输入的数字而不将其存储在列表中

从JOptionPane读取用户输入并将其存储在文本文件中

如何选择页面中的所有链接并将其存储在水豚中的数组中?

如何读取存储过程的输出并将其作为列表返回

从文件中读取数据并将其存储到结构中