изменить значение строки в связанном списке - PullRequest
2 голосов
/ 28 апреля 2020

Я новичок в отношении C, я надеюсь, что кто-то может мне помочь. Итак, я пытался изменить значение имени строки на другое значение, но когда распечатывается список, значение строки не меняется, когда я вводю значение с помощью scanf. Если я, например, вставлю значение вручную, как это, с помощью функции push(&head, "Carlos"), то значение имени изменится.

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

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


void printList(struct Node *n){
    while (n != NULL){
        printf(" name: %s \n ", n->name);
        printf("....................................\n");
        n = n->next;
    }
}

void push(struct Node **head_ref,  char *name){
    struct Node *new_node = (struct Node *)malloc(sizeof(struct Node));
    new_node->name = name;

    new_node->next = (*head_ref);

    (*head_ref) = new_node;
}

int main(){
    struct Node *head = NULL;

    char name[20];

    printf("Insert a name");
    scanf("%s", name);

    push(&head, name);

    printf("Insert a new name");
    scanf("%s", name);

    push(&head, name);

    push(&head, "Carlos");


    printList(head);

    return 0;
}

Если я введу два имени, таких как: «nadia», «pedro», результат будет следующим:

    Output:

    Carlos
    ....................................
    pedro
    ....................................
    pedro
    ....................................

Результат, который я хочу получить, будет следующим:

    Output:

    Carlos
    ....................................
    pedro
    ....................................
    nadia
    ....................................

Ответы [ 2 ]

5 голосов
/ 28 апреля 2020

Вы должны использовать strcpy для копирования строки в c. Вы должны выделить для name в каждом new_node:

new_node->name = malloc(20*sizeof(char));
if(!new_node->name) {//handle error}
strcpy(new_node->name,name);

Я вижу в вашем коде:

 scanf("%s", name);

Вы должны перейти на (вы можете увидеть Недостатки scanf ):

 scanf("%19s", name);

Или вы можете использовать fgets вместо:

fgets(name, sizeof(name), stdin);
3 голосов
/ 28 апреля 2020

Вы - имя пользователя scanf для того же буфера! вам нужно выделить (в куче или в стеке) другой буфер для следующего сканирования.
см. основной:

   int main(){
    struct Node *head = NULL;
    char namex[20];
    char namey[20];
    printf("Insert a name\n");
    scanf("%s", namex);
    push(&head, namex);
    printf("Insert a new name\n");
    scanf("%s", namey);
    push(&head, namey);
    printList(head);

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