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++ リファレンスから

成功すると、この関数は、正常に埋められた引数リストの項目数を返します。このカウントは、一致の失敗、読み取りエラー、またはファイルの終わりに達したために、予想される項目数と一致するか、それより少ない (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;
}

ユーザーが浮動小数点数ではないものを入力した場合、プログラムを中止する必要があります

于 2013-10-13T03:52:55.240 に答える