为什么getchar()没有收到任何输入?

时间:2015-09-05 16:06:12

标签: c arrays string fgets 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 个答案:

答案 0 :(得分:3)

  

为什么没有getchar()收到任何输入?

代码有两个问题:

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);
        }  
    }

答案 1 :(得分:2)

问题是scanf。它不会从输入缓冲区中删除换行符,因此getchar读取的第一个内容是\n - char。

要解决此问题,您可以在之前添加getchar调用,以便从缓冲区中删除该字符,然后下一个getchar读取您的输入。像这样:

...
scanf("%d", &age);
...
getchar();
mar = getchar();
...