繁体   English   中英

如何从stdin读取多行并将其存储在链表中

[英]how to read multiple lines from stdin and store it in linked list

我正在尝试编写一个程序,从用户(来自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);
}

几个问题:

  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; } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM