3

私は C を学ぼうとしていて、さまざまな形状の面積を計算する小さなプログラムを作成しました。ソースコードは次のとおりです。

#include "stdafx.h"

struct entry
{
    float x;
    float y;
};

void square()
{
    printf("\nPlease enter the size of one of the square's sides\n");

    struct entry sq;
    scanf_s("%f\n", &sq.x);

    printf("\nThe area of the square is %.2f\n\n", sq.x * sq.x);
}

void rectangle()
{
    printf("\nPlease enter the length and breadth of the rectangle\n");

    struct entry rec;
    scanf_s("%f\n", &rec.x);
    scanf_s("%f\n", &rec.y);

    printf("\nThe area of the rectangle is %.2f\n\n", rec.x * rec.y);
}

void triangle()
{
    printf("\nPlease enter the width and height of the triangle\n");

    struct entry tri;
    scanf_s("Width: %f\n", &tri.x);
    scanf_s("Height: %f\n", &tri.y);

    printf("\nThe area of the triangle is %.2f\n\n", (tri.x * tri.y)/2);
}

void circle()
{
    printf("\nPlease enter the radius of the circle\n");

    struct entry circ;
    scanf_s("%f\n", &circ.x);

    printf("\nThe area of the circle is %.2f\n\n", 3.14 * circ.x * circ.x);
}


void main()
{
    int input = 0;

    do
    {
        printf("---Area of a Shape---\n\n");
        printf("1. Square\n");
        printf("2. Rectangle\n");
        printf("3. Triangle\n");
        printf("4. Circle\n");
        printf("5. Exit\n");
        printf("\n\n");

        printf("Please make a choice\n");
        scanf_s("%d", &input);

        switch(input)
        {
            case 1: square();
                    break;

            case 2: rectangle();
                    break;

            case 3: triangle();
                    break;

            case 4: circle();
                    break;

            case 5: printf("\n\nThank you for using this program!  Press enter to exit!\n");
                    break;

            default: printf("\nInvalid choice!\n\n");
                    break;
        }       
    }
    while(input != 5);

    getchar();
    getchar();
}

このプログラムで私が抱えている唯一の問題は、面積を計算するために辺のサイズを入力した後、答えを表示する前に (選択するために) 別の数値を入力するのを待つことです。どこに問題があるのか​​わからない。別の関数に移動する前に、C は手元にある関数全体を実行することを確認していると思いました。この問題を解決するのを手伝ってくれませんか? ありがとう。

4

1 に答える 1

7

あなたのscanfフォーマットでは、

scanf_s("%f\n", &rec.x);

the'\n'はリテラルを表すのではなく'\n'、空白文字の任意のシーケンスを表します。したがって、scanf_s数字 (および空白) の後に空白以外の文字を入力するまで、呼び出しは終了しません [その後に改行を入力するまで、入力はおそらくプログラムに送信されません]。'\n'をフォーマットから削除するだけです。

于 2012-07-31T15:19:21.193 に答える