C语言,谁能看出这个程序哪里有问题么,第二次字母选项就不行了。

#include<stdio.h>
void print(void);
float getnum(void);
char getletter(void);
char getletter1(void);
int main(void)
{
    float number1,number2;
    char choice;
    print();
    while ((choice = getletter1() )!= 'q')
    {
        printf("enter first number:\n");
        number1 = getnum();
        printf("enter second number:\n");
        number2 = getnum();
        switch (choice)
        {
        case 'a':printf("%g+%g=%g\n", number1, number2, number1 + number2); break;
        case 's':printf("%f-%f=%f\n", number1, number2, number1 - number2); break;
        case 'm':printf("%f*%f=%f\n", number1, number2, number1*number2); break;
        case 'd':if(!number2)
        printf("enter a number other than 0;\n"); number2 = getnum();
        printf("%f/%f=%f\n", number1, number2, number1 / number2); break;
        }
        printf("\n");
        printf("\n");
        printf("\n");
        print();
    }
    printf("bye!\n");
    return 0;
}
void print(void)
{
    printf("enter the operation of your choice:\n");
    printf("a.add           s.subtract\n");
    printf("m.multiply      d.divide\n");
    printf("q.quit\n");
}
float getnum(void)
{
    float number;
    char ch;
    while (scanf("%g", &number) != 1)
    {
        while ((ch=getchar() )!= '\n')
        {
            putchar(ch);
            printf(" is not a number.\n");
            printf("please enter a number,such as 2.5,-1.78e8 or 3:\n");
        }
        while (getchar() != '\n')
            continue;
    }
    return number;
}
char getletter(void)
{
    int ch;
    ch = getchar();
    while (getchar() != '\n')
        continue;
    return ch;
}
char getletter1(void)
{
    int ch;
    ch = getletter();
    while(ch!='a'&&ch!='s'&&ch!='m'&&ch!='d'&&ch!='q')
    {
        printf("please respond with a,s,m,d.\n");
        ch = getletter();
    }
    return ch;
}
 

知识点:

  • getchar 函数会移除读取字符的下一个字符,而 scanf 不会

问题:

  • getnumber 里的 scanf 用户输入`字符`+`回车`之后,字符被scanf吃掉了,字符 `\n` 却留在了输入缓冲区里。
  • 等到调用getletter函数时,里面的第一个 getchar 立刻读取了 scanf 留下来的 `\n`,不满足后面的判断:`ch!='a'&&ch!='s'&&ch!='m'&&ch!='d'&&ch!='q'`
  • 于是,就打印出了:"please respond with a,s,m,d.\n"

解决办法:

  • 在getnumber 函数后调用下面这个 `flush` 函数,清空下输入缓冲区里残留的 `\n`
  • void flush(void) { while (getchar() != '\n');}

看来很难哦,都没人知道。。。