0

以下程序提示输入计算圆柱体的体积。当输入任何数量的非数字事物时如何终止该程序?

#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;
}
4

2 回答 2

1

scanf()返回分配的输入项的数量,在早期匹配失败的情况下,该数量可以少于提供的数量或为零。如果在任何转换之前发生输入失败,该函数将返回 EOF (-1)。如果发生错误,scanf 将 errno 设置为非零值。因此,您可以检查 scanf 的输出,并确定是否应该退出,或者至少绕圈再试一次。我相信这就是@Charlie 在他的评论中的意思,也是@h3nr1x 答案会很好用的原因。

于 2013-10-13T03:55:16.767 回答
0

来自C++ 参考

成功时,该函数返回参数列表中成功填充的项目数。由于匹配失败、读取错误或到达文件结尾,此计数可以与预期的项目数匹配或更少(甚至为零)。

如果发生读取错误或读取时到达文件结尾,则设置正确的指示符(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;
}

如果用户输入的不是浮点数,那应该中止程序

于 2013-10-13T03:52:55.240 回答