以下程序提示输入以计算气缸的容量。如果输入任何数量的非数字物,如何终止该程序?
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
float areaCirc(float r) {
return (M_PI*r*r);
}
float volCyl(float r, float h) {
return (areaCirc(r)*h);
}
int main(void) {
float r, h;
int k = 0;
float volume;
float avgh = 0;
float toth = 0;
do {
scanf("%f%f",&r,&h);
if(r<=0 || h<=0) {
break;
}
volume = volCyl(r,h);
k = k++;
printf(" Cylinder %d radius %.2f height %.2f volume %.2f\n",k,r,h,volume);
toth = toth + h;
} while(r>0 && h>0);
avgh = toth/k;
printf("Total Height: %.2f\n",toth);
printf("Average Height: %.2f\n",avgh);
return EXIT_SUCCESS;
}
答案 0 :(得分:1)
scanf()
返回分配的输入项数,可以少于提供的数量,或者在早期匹配失败时返回零。如果在任何转换之前发生输入故障,则该函数返回EOF(-1)。如果发生错误,scanf会将errno设置为非零值。因此,您可以检查scanf的输出,并确定是否应该退出,或至少绕过另一次尝试。我相信这是@Charlie在评论中的意思,@ h3nr1x答案的原因会很好。
答案 1 :(得分:0)
成功时,该函数返回成功填充的参数列表的项数。此计数可以匹配预期的项目数,或者由于匹配失败,读取错误或文件结束的范围而更少(甚至为零)。
如果在读取时发生读取错误或达到文件结尾,则设置正确的指示符(feof或ferror)。并且,如果在成功读取任何数据之前发生任何一次,则返回EOF。
如果解释宽字符时发生编码错误,则该函数将errno设置为EILSEQ。
在代码中添加以下修改:
int res = scanf("%f%f",&r,&h);
if (res != 2) {
printf("Expected two floating point numbers, aborting!\n");
return EXIT_FAILURE;
}
如果用户输入的不是浮点数
,那么应该中止该程序