以下代码适用于模块化计算器问题。输入数据是:
5 +3 * 7 +10 * 2 * 3 +1 % 11
#include <stdio.h>
int main(void) {
char oper;
int number,result;
scanf("%d",&number);
result=number;
do
{
oper=getchar();
fflush(stdin);
scanf("%d",&number);
if(oper=='+')
{
result=result+number;
}
else if(oper=='*')
{
result=result*number;
}
printf("%c %d %d ",oper,number,result);
}while(oper!='%');
result=result%number;
printf("%d",result);
return 0;
}
我得到的输出如下:
3 5
3 5 * 7 35
10 35
10 35 * 2 70
2 70 * 3 210
1 210
1 210 % 11 210 1
我似乎无法弄明白为什么?
答案 0 :(得分:1)
替换
oper=getchar();
fflush(stdin);
scanf("%d",&number);
与
scanf(" %c", &oper);
scanf("%d", &number);
答案 1 :(得分:1)
如果你写scanf(" %c", &operator)
,%c
中" %c"
之前的空格会在阅读单个字符之前消耗任意数量的空白字符。
此外,scanf
会在匹配失败时返回EOF
。您可以将其用作while
循环的条件。
还有一个建议:在执行操作之前,将result
存储在previous
变量中,以便您可以在操作之前和之后打印该值。这将导致用户友好的输出。
#include <stdio.h>
int main(void) {
char operator;
int number, previous, result;
scanf("%d", &number);
result = number;
while (scanf(" %c", &operator) != EOF) {
previous = result;
scanf("%d", &number);
if (operator == '+') {
result += number;
} else if (operator == '-') {
result -= number;
} else if (operator == '*') {
result *= number;
} else if (operator == '/') {
result /= number;
} else if (operator == '%') {
result %= number;
}
printf("%d %c %d = %d\n", previous, operator, number, result);
}
return 0;
}
答案 2 :(得分:1)
一般情况下,我发现使用fgets()
比scanf()
/ getchar()
更好(或者,如果您使用的是C99,gets_s()
- 我仍然更喜欢{ {1}}以便为所有基于用户的输入提供对旧编译器环境的最大可移植性,然后在必要时使用fgets()
,sscanf()
(等)将字符串转换为其他数据类型,因为这将以缓冲区安全的方式逐行读取数据,您不必担心输入缓冲区中剩余的内容。 对于基于用户的输入尤其如此,这种输入从来没有格式良好(由于拼写错误等)。 strtol()
只有在阅读格式良好的输入文件时才能正常工作。
考虑到这一点,我会更像这样编写代码:
scanf()