Почему getchar() не получает никакой информации?
Я создал программу, чтобы узнать, как вас зовут, если вы мужчина или женщина, сколько вам лет, и если я буду называть вас миссис, мисс, мистер или просто по вашему полному имени, в зависимости от предыдущих условий. Когда я выбираю свой пол как женский и ввожу имя, фамилию и возраст, превышающий или равный 20, я спрашиваю, женат ли этот человек, однако по какой-либо причине программа пропускает getchar
и просто заканчивает программу.
Вот код:
#include <stdio.h>
#include <string.h>
int main()
{
char gender;
char fName[15];
char lName[15];
char mar;
char str[] = "Then I shall call you";
int age = 0;
printf("What is your gender (M or F): ");
gender = getchar();
printf("First name: ");
scanf("%s", fName);
//fgets(fName, 16, stdin);
//fName[strcspn(fName, "\n")] = 0;
printf("Last name: ");
scanf("%s", lName);
//fgets(lName, 16, stdin);
//lName[strcspn(lName, "\n")] = 0;
printf("Age: ");
scanf("%d", &age);
puts("");
if(gender == 'F' || gender == 'f')
{
if(age >= 20)
{
printf("Are you married, %s (y or n)?: ", fName);
//scanf("%c", &mar);
mar=getchar();
printf("%c\n", mar);
if(mar == 'Y' || mar == 'y')
printf("%s Mrs. %s.\n", str, lName);
else if(mar == 'n' && age >= 20|| mar == 'N' && age >= 20)
printf("%s Ms. %s.\n", str, lName);
}
else
printf("%s %s %s.\n", str, fName, lName);
}
else if(gender == 'M' || gender == 'm')
{
if(age >= 20)
printf("%s Mr. %s.\n", str, lName);
else
printf("%s %s %s.\n", str, fName,lName);
}
return 0;
}
И вывод:
What is your gender (M or F): F
First name: Jane
Last name: Doe
Age: 25
Are you married, Jane (y or n)?:
У меня также есть другой вопрос относительно того, когда я использовал fgets
вместо scanf
читать строку. Как я слышал, как правило, держаться подальше от scanf
при чтении строк я пытался fgets
но результат был не таким, как я хотел.
Вот вывод, когда я использовал fgets
вместо scanf
:
What is your gender (M or F): M
First name: Last name: Joe
Age: 23
Then I shall call you Mr. Joe.
Вывод должен быть таким, каким он был, когда я использовал scanf
так что фамилия находится под именем.
2 ответа
Почему не
getchar()
получить какой-либо вклад?
Код имеет 2 проблемы:
1) Он получил остаток '\n'
из предыдущей строки, используйте scanf(" %c", &mar);
(отметьте пробел) или, еще лучше, замените все ввод fgets()
2) Не сообщалось о неожиданном вводе. Код должен обнаруживать и сообщать о неожиданном вводе и обрабатывать все возможные пути логики. Пример:
{
printf("Are you married, %s (y or n)?: ", fName);
mar=getchar();
printf("%c\n", mar);
if(mar == 'Y' || mar == 'y')
printf("%s Mrs. %s.\n", str, lName);
else if(mar == 'N' || mar == 'n') {
if (age >= 20)
printf("%s Ms. %s.\n", str, lName);
else
printf("%s ??? %s.\n", str, lName);
}
else {
printf("Unexpected input char:'%c' code:%d\n", mar, mar);
}
}
Проблема в scanf
, Он не удаляет символ новой строки из входного буфера, поэтому первым делом getchar
читает это \n
-char.
Чтобы решить эту проблему, вы можете, например, добавить getchar
вызов до, поэтому персонаж удаляется из буфера и следующий getchar
читает ваш вклад. Как это:
...
scanf("%d", &age);
...
getchar();
mar = getchar();
...