Не удается прочитать символ с клавиатуры

#c #input #scanf #fgets

#c #входные данные #scanf #фгеты

Вопрос:

У меня возникли проблемы с чтением символа от моего пользователя. Программа, которую я пытаюсь разработать, представляет собой симулятор банковского менеджера, в котором у пользователя есть несколько действий, которые он может выполнить. Проблема в том, что после первого чтения от пользователя программа, кажется, «пропускает» fgets() строку. Вот этот код:

 #include <stdio.h>
#include "myBank.h"

int main(void){
  printf("Welcome to our bank!n");
  char action[1];
  while (1)
  {

    //action = ' ';
    printf("nHere is a list of actions you can preform:n");
    printf("Ot Open a new accountn");
    printf("Bt Check balancen");
    printf("Dt Make a depositn");
    printf("Wt Make a withdrawln");
    printf("Ct Close your accountn");
    printf("It Add interest to all accountsn");
    printf("Pt Get info of all accountsn");
    printf("Et Close all accounts and end this programn");

    fgets(action, 2, stdin);

    switch (action[0]) {
           case 'O':
               openAccount(); break;
           case 'B':
               checkBalance(); break;
           case 'D':
               deposit(); break;
           case 'W':
               withdraw(); break;
           case 'C':
               closeAccount(); break;
           case 'I':
               interest(); break;
           case 'P':
               print(); break;
           case 'E':
               end();
           default:
               printf("Invalid action was enteredn"); break;
    }
  }
  return 0;
}
 

Первоначально я использовал scanf() вместо этого, но это вызвало ту же проблему.

Вот мои входные и выходные данные:

 Welcome to our bank!

Here is a list of actions you can preform:
O    Open a new account
B    Check balance
D    Make a deposit
W    Make a withdrawl
C    Close your account
I    Add interest to all accounts
P    Get info of all accounts
E    Close all accounts and end this program
O
How much would you like to deposit?
f
Wrong input!

Here is a list of actions you can preform:
O    Open a new account
B    Check balance
D    Make a deposit
W    Make a withdrawl
C    Close your account
I    Add interest to all accounts
P    Get info of all accounts
E    Close all accounts and end this program
Invalid action was entered

Here is a list of actions you can preform:
O    Open a new account
B    Check balance
D    Make a deposit
W    Make a withdrawl
C    Close your account
I    Add interest to all accounts
P    Get info of all accounts
E    Close all accounts and end this program
Invalid action was entered

Here is a list of actions you can perform:
O    Open a new account
B    Check balance
D    Make a deposit
W    Make a withdrawal
C    Close your account
I    Add interest to all accounts
P    Get info of all accounts
E    Close all accounts and end this program
 

Что я сделал, так это открыл новую учетную запись и ввел неверный ввод (char вместо int).
openAccount исправил неправильный ввод и вернулся к основному, но вместо того, чтобы показывать меню еще один раз, он показывает его еще три раза.

Какая-нибудь помощь?

Комментарии:

1. action объявляется как массив размером 1. fgets со 2-м аргументом 2 пытается записать 2 символа в массив размером 1. Случаются плохие вещи.

2. Если вы хотите прочитать строку из одного символа action , то массив должен иметь размер не менее 3, и вы должны вызвать fgets(action, sizeof action, stdin) его . Если входные данные представляют собой строку из одного символа, то будет записан символ, символ новой строки и нулевой ограничитель. Но если строка ввода содержит более одного символа, fgets не будет использовать новую строку.