Пропуск первого поля структуры при заполнении очереди - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Нужна помощь...После создания первого узла,при добавлении узла ,внесение нового элемента начинается только со второго поля...Почему пропускает первое поле(первую строку) я не понимаю.Так же после очистки очереди,добавление первого узла начинается со второго поля структуры...Не понимаю в чём дело,помогите пожалуйста!
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
 
typedef struct node 
  {
    char schet1[20];  //расчетный счет плательщика
    char schet2[20];  //расчетный счет получателя
    int summa;    //перечисляемая сумма
    struct node *next;   //указатель на следующий узел
  }Node;
void first();
void add();
void del();
void display();
void length();
void clean();
int enter();
Node *head=NULL,*tail=NULL; //указатель на начало,конец =NULL
    char sch1[20];  //расчетный счет плательщика
    char sch2[20];  //расчетный счет получателя
    int sum;    //перечисляемая сумма
void main()
{
 _getch();
 enter();
}
int enter()
{
    system("cls");
    char choice;
    puts("1. Начальное формирование очереди (создание самого первого узла)");
    puts("2. Добавление нового узла в конец очереди");
    puts("3. Удаление первого узла из очереди");
    puts("4. Вывод данных из всех узлов очереди на экран");
    puts("5. Определение длины очереди");
    puts("6. Очистка очереди (удаление всех узлов)");
    puts("7. Завершение работы программы");
    while(1) {
     choice=getch();
     switch (choice) {
     case '1':
            first();
            break;
     case '2':
            add(); //Добавление элемента
            break;
     case '3':
            del(); // удаление элемента
            break;
     case '4':
            display(); // отображение элементов очереди
            break;
     case '5':
            length(); // определение длины очереди
            break;
     case '6':
            clean(); // очистка всей очереди
            break;
     case '7':
            puts(">>Завершение работы<<");
            return 0;
     default:
           system("cls");
           puts(">>Выбор не сделан,попробуйте ещё раз!<<");
           enter();
     }
     return 0;
 }
}
 
void first() {
    Node *p;
    if ((head == NULL) && (tail == NULL)) 
      { 
        p=(Node*)malloc(sizeof(Node));
 
        puts("Введите номер плательщика: \n");
        gets(sch1); //ввод строки
        strcpy_s(p->schet1, sch1);
        puts("Введите номер получателя: \n");
        gets(sch2); //ввод строки
        strcpy_s(p->schet2, sch2); 
        puts("Введите сумму платежа: \n");
        scanf("%d",&sum);
        p->summa = sum; //ввод значений
        p->next = NULL; //указатель на след элемент = NULL
        head = tail = p; //указателю конца и начала присваивается значение элемента очереди(узла)
    getch();
    enter();
      } 
   else 
        puts(">>Первый элемент уже создан<<");
    getch();
    enter();
      }
 
void add() {
    Node* p;
if ((head == NULL) && (tail == NULL)) 
{
 
  puts(">>Сначала создайте первый элемент<<"); 
  getch();
  enter();
  }
  else {
    p=(Node*)malloc(sizeof(Node));
    puts("Введите номер плательщика: \n");
    gets(sch1);
    strcpy_s(p->schet1, sch1); 
    puts("Введите номер получателя: \n");
    gets(sch2);
    strcpy_s(p->schet2, sch2);
    puts("Введите сумму платежа: \n");
    scanf("%d",&sum);
    p->summa = sum; 
    p->next=NULL;
    tail->next=p;
    tail=p;
    puts(">>элемент добавлен<<");
    getch();
    enter();
   }
}
 
void del() {
 puts(">>Удаление элемента<<");
 Node* p=head;
 if(head!=NULL) {
     head=head->next;
     if(head==NULL)
         tail=NULL;
     free(p);
}
 getch();
 enter();
}
void display() {
     Node* p=head;
    if (p==NULL)
     printf(">>Очередь пуста<<\n");
  else 
    printf(">>>>>>>>>Очередь :\n");
    while (p!=NULL) {
      printf("Номер плательщика:%s\nНомер получателя:%s\nСумма платежа:%d\n", p->schet1, p->schet2, p->summa);
      puts("___________________");
      p=p->next;
       }
getch();
enter();
}
void length(){
        Node* p = head;
        int count = 0;
        int c;
        while (p!= NULL) 
        {
                count++;
                p = p->next;
        }
printf("Длина очереди :\n%d\n\n",count);
getch();
enter();
}
void clean() {
  puts(">>Очистка очереди<<");
  if(head==NULL && tail==NULL) {
        puts(">>Очередь пуста<<");
        getch();
        enter();
   }
  else
  {
      node *p;
      while(head!=NULL && tail!=NULL)
      {
          p=head;
          head=p->next;
          delete p;
      }
      head=NULL;
      tail=NULL;
      puts(">>Очередь удалена<<");
  }
}
Нашёл способ как исправить,всё оказалось очень легко,вот готовый вариант.Добавил fflush(stdin); после ввода полей.
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
 
typedef struct node 
  {
    char schet1[20];  //расчетный счет плательщика
    char schet2[20];  //расчетный счет получателя
    int summa;    //перечисляемая сумма
    struct node *next;   //указатель на следующий узел
  }Node;
void first();
void add();
void del();
void display();
void length();
void clean();
int enter();
Node *head=NULL,*tail=NULL; //указатель на начало,конец =NULL
    char sch1[20];  //расчетный счет плательщика
    char sch2[20];  //расчетный счет получателя
    int sum;    //перечисляемая сумма
void main()
{
 _getch();
 enter();
}
int enter()
{
    system("cls");
    char choice;
    puts("1. Начальное формирование очереди (создание самого первого узла)");
    puts("2. Добавление нового узла в конец очереди");
    puts("3. Удаление первого узла из очереди");
    puts("4. Вывод данных из всех узлов очереди на экран");
    puts("5. Определение длины очереди");
    puts("6. Очистка очереди (удаление всех узлов)");
    puts("7. Завершение работы программы");
    while(1) {
     choice=getch();
     switch (choice) {
     case '1':
            first();
            break;
     case '2':
            add(); //Добавление элемента
            break;
     case '3':
            del(); // удаление элемента
            break;
     case '4':
            display(); // отображение элементов очереди
            break;
     case '5':
            length(); // определение длины очереди
            break;
     case '6':
            clean(); // очистка всей очереди
            break;
     case '7':
            puts(">>Завершение работы<<");
            return 0;
     default:
           system("cls");
           puts(">>Выбор не сделан,попробуйте ещё раз!<<");
           enter();
     }
     return 0;
 }
}
 
void first() {
    Node *p;
    if ((head == NULL) && (tail == NULL)) 
      { 
        p=(Node*)malloc(sizeof(Node));
 
        puts("Введите номер плательщика: \n");
        gets(sch1); //ввод строки
        strcpy_s(p->schet1, sch1);
        puts("Введите номер получателя: \n");
        gets(sch2); //ввод строки
        strcpy_s(p->schet2, sch2); 
        puts("Введите сумму платежа: \n");
        scanf("%d",&sum);
        p->summa = sum; //ввод значений
        fflush(stdin);
        p->next = NULL; //указатель на след элемент = NULL
        head = tail = p; //указателю конца и начала присваивается значение элемента очереди(узла)
    getch();
    enter();
      } 
   else 
        puts(">>Первый элемент уже создан<<");
    getch();
    enter();
      }
 
void add() {
    Node* p;
if ((head == NULL) && (tail == NULL)) 
{
 
  puts(">>Сначала создайте первый элемент<<"); 
  getch();
  enter();
  }
  else {
    p=(Node*)malloc(sizeof(Node));
    puts("Введите номер плательщика: \n");
    gets(sch1);
    strcpy_s(p->schet1, sch1); 
    puts("Введите номер получателя: \n");
    gets(sch2);
    strcpy_s(p->schet2, sch2);
    puts("Введите сумму платежа: \n");
    scanf("%d",&sum);
    p->summa = sum; 
    fflush(stdin);
    p->next=NULL;
    tail->next=p;
    tail=p;
    puts(">>элемент добавлен<<");
    getch();
    enter();
   }
}
 
void del() {
 puts(">>Удаление элемента<<");
 Node* p=head;
 if(head!=NULL) {
     head=head->next;
     if(head==NULL)
         tail=NULL;
     free(p);
}
 getch();
 enter();
}
void display() {
     Node* p=head;
    if (p==NULL)
     printf(">>Очередь пуста<<\n");
  else 
    printf(">>>>>>>>>Очередь :\n");
    while (p!=NULL) {
      printf("Номер плательщика:%s\nНомер получателя:%s\nСумма платежа:%d\n", p->schet1, p->schet2, p->summa);
      puts("___________________");
      p=p->next;
       }
getch();
enter();
}
void length(){
        Node* p = head;
        int count = 0;
        int c;
        while (p!= NULL) 
        {
                count++;
                p = p->next;
        }
printf("Длина очереди :\n%d\n\n",count);
getch();
enter();
}
void clean() {
  puts(">>Очистка очереди<<");
  if(head==NULL && tail==NULL) {
        puts(">>Очередь пуста<<");
        getch();
        enter();
   }
  else
  {
      node *p;
      while(head!=NULL && tail!=NULL)
      {
          p=head;
          head=p->next;
          delete p;
      }
      head=NULL;
      tail=NULL;
      puts(">>Очередь удалена<<");
  }
}
Он тоже неправильно работает....Нужно перед каждым вводом в поле вставить fflush(stdin);

Решение задачи: «Пропуск первого поля структуры при заполнении очереди»

textual
Листинг программы
while( getchar() != '\n' );

Объяснение кода листинга программы

  1. В начале программы открывается стандартный ввод (stdin).
  2. Затем в цикле while считывается каждый символ из стандартного ввода до тех пор, пока не встретится символ новой строки '\n'.
  3. Каждый символ добавляется в конец буфера, пока буфер не заполнится.
  4. Когда встречается символ новой строки, буфер очищается и процесс начинается заново.
  5. Код не обрабатывает символы новой строки, поэтому они остаются в буфере и могут быть считанными в следующей итерации цикла.
  6. Код не обрабатывает символы возврата каретки '\r', которые могут быть в буфере.
  7. Код не обрабатывает символы перевода строки '\n\r', которые могут быть в буфере.
  8. Код не обрабатывает символы перевода страницы '\f', которые могут быть в буфере.
  9. Код не обрабатывает символы удаления '\b', которые могут быть в буфере.
  10. Код не обрабатывает символы пробела '\s', которые могут быть в буфере.
  11. Код не обрабатывает символы табуляции '\t', которые могут быть в буфере.
  12. Код не обрабатывает символы заголовка '\033', которые могут быть в буфере.
  13. Код не обрабатывает символы перевода регистра '\r', которые могут быть в буфере.
  14. Код не обрабатывает символы двубайтных символов, которые могут быть в буфере.
  15. Код не обрабатывает символы многобайтных символов, которые могут быть в буфере.
  16. Код не обрабатывает символы не ASCII, которые могут быть в буфере.
  17. Код не обрабатывает символы кодовой страницы ISO-8859-1, которые могут быть в буфере.
  18. Код не обрабатывает символы кодовой страницы ISO-8859-2, которые могут быть в буфере.
  19. Код не обрабатывает символы кодовой страницы ISO-8859-3, которые могут быть в буфере.
  20. Код не обрабатывает символы кодовой страницы ISO-8859-4, которые могут быть в буфере.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.714 из 5
Похожие ответы