C語言,誰能看出這個程序哪裏有問題麼,第二次字母選項就不行了。

CSDN問答 2022-01-08 04:00:09 阅读数:587

能看 看出 程序 第二次 第二

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


其他答案2:

看來很難哦,都沒人知道。。。

版权声明:本文为[CSDN問答]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201080400084968.html