如何在C中进行此分配?

时间:2013-10-13 03:38:36

标签: c scanf

以下程序提示输入以计算气缸的容量。如果输入任何数量的非数字物,如何终止该程序?

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

来自C++ Reference

  

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

     

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

如果用户输入的不是浮点数

,那么应该中止该程序