pepsi02
pepsi02
2021-03-01 18:04
采纳率: 77.8%
浏览 61

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • huanhuilong
    幻灰龙 2021-03-02 10:12
    已采纳

    知识点:

    • 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');}
    点赞 1 评论
  • pepsi02
    pepsi02 2021-03-01 22:55

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

    点赞 评论

相关推荐