使用一个非常简单的计算器程序,提示用户执行操作,然后提示两个整数来执行此操作。程序应该在这些操作之后循环,除非用户输入字符'q',此时程序应该退出。
#include <stdio.h>
int main (void)
{
char c;
int number[2], num1, num2, result;
double num1d, num2d, resultd;
int done=1;
while(done)
{
printf("\t What sort of operation would you like to perform? \n \t Type + - * / accordingly. \n");
c = getchar();
printf("\tplease enter a number \n");
scanf("%d",&number[0]);
printf("\tplease enter another number \n");
scanf("%d",&number[1]);
num1 = number[0];
num2 = number[1];
switch(c)
{
case('-'):
result = num1-num2;
printf("\nThe first number you entered subtracted by the second number is %d.\n", result);
break;
case('+'):
result = num1+num2;
printf("The first number you entered added to the second number is %d.\n", result);
break;
case('*'):
result = num1*num2;
printf("The first number you entered multiplied with the second number is %d.\n", result);
break;
case('/'):
num1d = (double) num1;
num2d = (double) num2;
resultd = num1d/num2d;
printf("The first number you entered divided by the second number is %g.\n", resultd);;
break;
case('q'):
printf(" Now Exiting...\n");
done=0;
break;
default:
puts("Invalid key pressed. Press q to exit");
break;
}
}
return 0;
}
正确地用于单个计算,但随后执行奇怪;特别是它打印
printf("\t What sort of operation would you like to perform? \n \t Type + - * / accordingly. \n");
printf("\tplease enter a number \n");
共
清除输入缓冲区while (getchar() != '\n');
的标准方法无法解决此问题。该文本显示不正确的两次中的一次仍然可以使用该程序,就像指令正在显示一样(因此用户可以键入操作,如+,回车,然后是一些整数和回车,并且程序将从该点开始正确执行)每隔一次,程序将按“无效键按下。无论输入如何,按q退出”。
答案 0 :(得分:4)
这里的其他人都说的是真的,getchar()
会返回int
,但这不是你的问题。
问题是getchar()
在您使用后会留下换行符。如果您要使用getchar()
,则必须始终以后使用换行符。这个简单的修复:
printf("\t What sort of operation would you like to perform? \n \t Type + - * / accordingly. \n");
c = getchar();
getchar(); //<-- here we do an extra getchar for the \n
printf("\tplease enter a number \n");
scanf("%d",&number[0]);
printf("\tplease enter another number \n");
scanf("%d",&number[1]);
这将消除这个问题。每次键入<somechar><enter>
时,它实际上都会在缓冲区中放置两个字符,例如,如果我按下+然后输入我正在获取:
'+''\n' // [+][\n]
getchar()
只会获得其中的第一个,然后再次调用getchar()
时,它将不会等待您的输入,它只会取'\n'
并继续{ {1}}
答案 1 :(得分:3)
不应将逐个字符与更高级别的输入函数(例如scanf()
)混合使用。最好使用scanf()
来输入命令字符,但当然你必须在命令后按Enter键。我相信这是你问题的根本原因。
顺便说一句,请注意getchar()
,尽管它的名称,但会返回int
,不是 char
。这是因为它可以返回EOF
,这是一个特殊的常量,其值与所有字符的值不同。
此外,您应该始终检查I / O函数的返回值,如scanf()
,如果输入与模式字符串不匹配,它们可能会失败。
作为调试提示,您当然可以在解释之前打印c
的值,这样您就可以更轻松地查看和理解程序的流程。
答案 2 :(得分:2)
我猜这是第一次有效,但不是下一次。这是因为scanf
调用将换行符留在输入缓冲区中,因此下次在循环中调用getchar
时它将返回换行符。在scanf
调用
scanf("%d ",&number[0]);
它将从缓冲区中丢弃剩余的空格。
使用调试器逐步执行代码并检查要验证的变量。
答案 3 :(得分:0)
你的getchar应该返回int
。原因如下
getchar reads characters from the program's standard input
and returns an int value suitable for storing into a char.
The int value is for one reason only: not only does getchar
return all possible character values, but it also returns an
extra value to indicate that end-of-input has been seen.
The range of a char might not be enough to hold this extra value,
so the int has to be used.
所以基本上你需要在代码中将char c
更改为int c