#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 не будет использовать новую строку.