Проблема повторного использования входных данных в массиве C - PullRequest
0 голосов
/ 10 ноября 2018
typedef struct NODE{
    char *word;
    struct NODE *next;
}node;

node *newNode(char *word) {
    node *pNode = (node*) malloc(sizeof(node));
    pNode->word = word;
    pNode->next = NULL;
    return pNode;
}

void append(node **ppList, char *word) {
    if(*ppList == NULL)
        *ppList = newNode(word);
    else {
        node *tmpList = *ppList;
        for(; tmpList->next!=NULL; tmpList=tmpList->next);
        tmpList->next = newNode(word);
    }
}

void printList(node *list) {
    for(; list!=NULL; list=list->next)
        printf("[%s]=>", list->word);
    printf("NULL");
}

/*=== CODE 1 ===*/
int main() {
    char word[MAXCHAR], word2[MAXCHAR], word3[MAXCHAR];
    node *list=NULL;

    scanf("%s", &word); /* key in AAA */
    append(&list, word);
    scanf("%s", &word2); /* key in BBB */
    append(&list, word2);
    scanf("%s", &word3); /* key in CCC */
    append(&list, word3);
    printList(list);
    return 0;
}

/*=== CODE 2 ===*/
int main() {
    char word[MAXCHAR];
    node *list=NULL;

    scanf("%s", &word); /* key in AAA */
    append(&list, word);
    scanf("%s", &word); /* key in BBB */
    append(&list, word);
    scanf("%s", &word); /* key in CCC */
    append(&list, word);
    printList(list);
    return 0;
}

Выходы:

=== CODE 1 OUTPUT ===
[AAA]=>[BBB]=>[CCC]=>NULL /* it works */

=== CODE 2 OUTPUT ===
[CCC]=>[CCC]=>[CCC]=>NULL /* doesnt work, why? */

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

1 Ответ

0 голосов
/ 10 ноября 2018

Проблема в том, что вы назначаете указатель.

pNode->word = word;

Поскольку pNode->word всегда будет указывать на обновленное значение word в main. Каждый узел в списке будет иметь одинаковое значение.

Вы должны скопировать содержимое word в main вместо назначения указателя.

node *newNode(char *word) {
    node *pNode = (node*) malloc(sizeof(node));

    pNode->word = malloc(strlen(word)+1);
    strcpy(pNode->word, word);

    pNode->next = NULL;
    return pNode;
}

Или

node *newNode(char *word) {
    node *pNode = (node*) malloc(sizeof(node));

    pNode->word = strdup(word);

    pNode->next = NULL;
    return pNode;
}

Примечание: strdup не C стандарт.

...