[英]Why is my '+' operator considered as a new line character?
以下代码用于模块化计算器问题。 输入数据是:
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
我似乎无法弄清楚为什么?
更换
oper=getchar();
fflush(stdin);
scanf("%d",&number);
同
scanf(" %c", &oper);
scanf("%d", &number);
如果你写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;
}
一般来说,我发现使用fgets()
比使用scanf()
/ getchar()
更好(或者,如果你使用C99, gets_s()
- 尽管我仍然喜欢fgets()
以便最大程度地移植到旧的编译器环境)所有基于用户的输入,然后在必要时使用sscanf()
, strtol()
(等)将字符串转换为其他数据类型,因为这将以缓冲区安全的方式逐行读取数据并且您赢了我不得不担心输入缓冲区中剩下的东西。 对于基于用户的输入尤其如此,这种输入从来没有格式良好(由于拼写错误等) 。 scanf()
实际上只有在从格式良好的输入文件中读取时才能正常工作。
考虑到这一点,我会编写更像这样的代码:
#include <stdio.h>
int main(void) {
char buf[80];
char oper;
int number,result;
fgets(buf, sizeof(buf), stdin);
sscanf(buf, "%d",&number);
printf(" saw input: %d\n", number );
result=number;
do
{
fgets(buf, sizeof(buf), stdin);
sscanf(buf, "%c %d",&oper, &number);
printf(" saw input: %c %d\n", oper, number );
printf(" computing: %d %c %d\n", result, oper, number );
if(oper=='+') {
result=result+number;
}
else if(oper=='*') {
result=result*number;
}
else if(oper=='%') {
result=result%number;
}
printf(" result : %d\n", result );
} while( oper!='%' );
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.