Почему 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();
...
Другие вопросы по тегам