#include <stdio.h>
#include <math.h>
int main()
{
int i;
int j;
int base;
int height;
int side;
int up;
int down;
int output[1001];
for (i = 0; i < 1000; i++)
{
char type = getchar();
if(type == 'P')
{
scanf("%d", &side);
output[i] = side * side;
}
else if (type == 'S')
{
scanf("%d %d", &base, &height);
output[i] = 0.5 * base * height;
}
else if (type == 'T')
{
scanf("%d %d %d", &up, &down, &height);
output[i] = height * (up + down) / 2;
}
else if(type == '0')
{
break;
}
}
for(j = 0; j < i; j++)
{
{
printf("%d\n", output[j]);
}
}
return 0;
}
我想要的是在我输入'0'后,程序停止请求输入然后给予输出。总体来说它是工作的,但是有一个错误,在每个输出中,总是有一行'0'。
样品输入:
P 5
S 10 10
T 10 10 10
0
我想要的输出:
25
50
100
我现在对这段代码的输出:
25
0
50
0
100
0
我猜是
else if(type == '0')
{
break;
}
这使得这个错误,但我不确定,我不知道如何解决这个问题
2条答案
按热度按时间vyswwuz21#
问题是这些线条
will not extract the newline character at the end of the line。
因此,在下一次循环迭代中,对
getchar
的调用将提取新行字符,而对scanf
的调用将失败,因为下一个字符是字母而不是数字。这意味着只有一次循环迭代后对getchar
的调用才会真正提取新行的第一个字符。通过在debugger中逐行运行程序,可以清楚地看到此错误,因为调试器将显示在第二次循环迭代中
type
的值将是\n
(ASCII代码10
)。要修复此错误,最简单的解决方案是在每次调用
scanf
后添加一个对getchar
的调用,这将丢弃输入流中的换行符。一个更健壮的解决方案不使用
scanf
,而是使用函数fgets
来始终精确读取一行输入,并使用sscanf
来解析输入:对于问题中指定的输入,此程序具有所需的输出:
ecbunoof2#
输入可以更好地可视化为:
i
在遇到一个零 * 之前 * 的每一个换行符时都增加一次。快速解决方法是在向数组中添加内容时仅递增
i
:当
getchar
返回EOF
时,仍然存在无限循环的问题,并且不检查scanf
的返回值以查看调用是否成功地执行了预期的 * 转换 * 次数,从而使您对不确定的值进行操作。对此进行一些重构: