запросить строку для хранения и сохранить в связанном списке с отпечатками, scanf - PullRequest
0 голосов
/ 22 декабря 2018

Я получил этот довольно простой код сборки с тремя различными подходами для хранения строки в узле связанного списка, но второй не работает

Сначала я создал узел структуры

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

и у меня есть функция printList

void printList(struct node *pointer)
{
    while (pointer != NULL)
    {
        printf("%s ", pointer->data);
        pointer = pointer->next;
    }
}

, чем основные вещи, такие как голова, второй и третий, чтобы NULL;и голова, вторая и третья MALLOC;

struct node* head = NULL;
struct node* second = NULL;
struct node* third = NULL;

head = (struct node*)malloc(sizeof(struct node));
second = (struct node*)malloc(sizeof(struct node));
third = (struct node*)malloc(sizeof(struct node));

это моя первая попытка, ведьма работает нормально:

char tmp[3]; //3 just for the testcase, and demonstration
printf("What do you want to store: ");
scanf("%s", tmp);
printf("This is stored in tmp: %s\n\n", tmp);
head->data = tmp; 
head->next = second; 

это моя третья попытка, тоже работает отлично:

third->data = "cool";
third->next = NULL;

это было бы самым важным, но я не могу это исправить ...

printf("What do you want to store: ");
scanf("%s", second->data);
second->next = third; 

printList(head); //calling the print function 

причина, по которой я делаю этот шаг за шагом вместо цикла, состоит в том, чтобы увидеть, чточто происходит в этот момент ... Я знаю, что я мог бы использовать 1-ю попытку для 3-й, но есть ли способ не использовать временное хранилище строк, почему я не могу сказать:

пользователь хочет:"Google" (% s) хранится во втором-> данных;и сделано

1 Ответ

0 голосов
/ 22 декабря 2018

В ваших рабочих случаях вы выделяете память для строки, на которую указывает data;во втором - нет (scanf помещает строку в пространство, которое вы ей передаете).Вы выделяете пространство для узла (на который указывает second), но не поле data внутри него.

Обратите внимание, что когда вы выделяете пространство, вы должны выделить достаточно для хранения строкивы поместите туда (включая завершающий символ \0).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...