#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;
}
C语言,谁能看出这个程序哪里有问题么,第二次字母选项就不行了。
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
2条回答 默认 最新
幻灰龙 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');}
本回答被题主选为最佳回答 , 对您是否有帮助呢?评论 打赏 举报解决 2无用