В чем может быть причина того, что дважды отображается «Введите символ:» и дважды выполняется самоисполняющаяся функция Insert () без ввода для второго выполнения? [дубликат]

Почему эта программа для создания связного списка символов и печати текущего добавленного элемента показывает вывод дважды?

И я новичок в структуре данных, поэтому хочу задать еще один вопрос. Правильно ли я сделал эту реализацию в функции Insert?

Код

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

struct Node
{
    char data;
    struct Node *next;
};
struct Node *Head;
void Insert(char data)
{
    struct Node *temp = (struct Node *)malloc(sizeof(struct Node));
    temp->data = data;
    temp->next = Head;
    Head = temp;
    printf("Data in  this Node: %c \n", temp->data);
    
}
int main()
{
    Head=NULL;
    char data;
    while (1)
    {
        printf("Enter a Character : ");
        scanf("%c", &data);
        if (data == '0')
            break;
        Insert(data);
    }
}

Выход

PS C:\Users\Dell\OneDrive\Desktop\Data Structure1\Data Structure Text Book> cd "c:\Users\Dell\OneDrive\Desktop\Data Structure1\Data Structure Text Book\Linked list\" ; if ($?) { gcc practice1.c -o practice1 } ; if ($?) { .\practice1 }
Enter a Character : q
Data in  this Node: q
Enter a Character : Data in  this Node:

Enter a Character : w
Data in  this Node: w
Enter a Character : Data in  this Node:

Enter a Character : 0
PS C:\Users\Dell\OneDrive\Desktop\Data Structure1\Data Structure Text Book\Linked list>
# linked-list
Источник
  • 0
    Почему в вопросе есть языковой тег c ++?
  • 0
    Вставьте пробел перед% c в вызове scanf ("% c", & data);
  • 0
    @VladfromMoscow, почему вставка пробелов перед% c сработала для меня, сэр. не могли бы вы мне объяснить?
  • 0
    Если перед спецификатором преобразования стоит пробел, то символы пробела, такие как, например, символ новой строки '\ n', будут пропущены во входном буфере.
Codelisting
за 1 против

Это потому, что когда вы нажимаетеq<RETURN> , с участием<RETURN> является клавишей Return , которая помещает символ перевода строки во входной поток послеq персонаж.

Лучше прочитать всю строку, а затем проверить, что:

char line[128];
while (fgets(line, sizeof line, stdin) != NULL)
{
  Insert(line[0]);
}
Codelisting
Популярные категории
На заметку программисту