我正在从Stephen Kochan的'C编程'中学习C语言。我正在进行第6章练习4,编写一个充当简单累加器计算器的代码。代码如下。只要以正确的方式提供输入,它就可以正常工作。
#include<stdio.h>
int main(void)
{
float num, accum = 0;
char operator;
while(1)
{
printf("Enter the number and the operator ");
scanf("%f %c",&num, &operator);
if (operator == 'E') break;
switch (operator){
case 'S':
accum = num;
printf("= %g\n",accum);
break;
case '+':
accum = accum + num;
printf("= %g\n",accum);
break;
case '-':
accum = accum - num;
printf("= %g\n",accum);
break;
case '*':
accum = accum * num;
printf("= %g\n",accum);
break;
case '/':
accum = accum / num;
printf("= %g\n",accum);
break;
}
}
printf("= %g\n",accum);
printf("End of Calculation\n");
return 0;
}
但它依赖于错误的输入。可以做些什么来检查这种行为?
答案 0 :(得分:6)
简短版本是“请勿使用scanf()
。”
问题是scanf()
仅提供有限的错误指示,并且在下一次调用时将未读取的错误数据留下来;特别是如果你不打算做错误检查,它就会永远在坏数据上旋转。
fgets()
或类似内容读取整行,并sscanf()
从该行进行解析。答案 1 :(得分:2)
不要使用scanf
。这是该计划的第一个建议。使用类似getchar
之类的内容here他们正在处理与您相同的问题。
答案 2 :(得分:2)
scanf()
是否返回2,表示它已填充两个参数为了提高健壮性,您可能希望使用fgets()
读取整行(不要使用gets()
,因为它容易受到缓冲区溢出)并使用sscanf()
解析结果。仅当您想要从错误输入提供恢复时,才需要这样做。否则,如果出现任何问题,只需坚持使用scanf()
和exit(1)
(以及错误消息)。