1

私のタスクでは、ループを使用して1〜5の入力を取得する必要があります。他の入力を取得する場合は、1〜5を取得するまで反復を続ける必要があります。

何が間違っているのか教えていただけますか?

私のコードの一部:

int rateSelected, weeklyHours;

    printf("Enter the number corresponding to the desired pay rate or action:\n");
    printf("1) %.2lf$/hr                               2) %.2lf$/hr\n", RATE1, RATE2);
    printf("3) %.2lf$/hr                              4) %.2lf$/hr\n", RATE3, RATE4);
    printf("5) Quit\n");

    while ((scanf("%d", &rateSelected)) != EOF && rateSelected != 5)
    {
        if (rateSelected > 5 || isalpha(rateSelected) ==1){
            printf("please enter a number between 1-5:\n");
        continue;
        }

        printf("Now enter your weekly hours:\n");
        scanf("%d", &weeklyHours);
        ChoosePayRate(rateSelected, weeklyHours);
    }

tnx

4

5 に答える 5

2

問題は、%dフォーマット指定子の使用です。数字の代わりに文字が入力された場合scanf、何も読み取られなかったことを示すためにゼロを返します。数字とともに文字を入力できるようにする場合scanfは、ゼロを返すときに文字列の読み取りを追加するか、常に文字列バッファーに読み取り、sscanfまたはatoiを使用して文字列を整数に変換する必要があります。

于 2013-01-29T15:10:24.700 に答える
0

を削除しisalpha(rateSelected)ます。

isalpha()パラメータとして渡された値が英数字かどうかをチェックしますが、int読み取ったばかりの値を渡しています。

ただし、これはまだ十分ではありません。実際にを読み取ったscanf()かどうかを確認するには、からの戻り値を取得する必要があります。ただし、intが入力されていない場合、文字は破棄されないため、次のscanf()で再度変換が試行され、無限ループが発生します。@dasblinkenlightが提供するソリューションを使用することをお勧めします。scanf()int

于 2013-01-29T15:10:11.017 に答える
0

isalpha(rateselected)int に int を格納しているため、 true になることはありませんrateselectedscanf("%d",rateselected)allready は文字入力のキャッチを処理し、その場合は 0 を返します。したがって、isalphaテストをテストに変更する必要がありrateselected == 0ます。

また、scanf は決して EOF を返しません。feof(stdin)0 が返されるので、実際に入力の終わりに到達したかどうかをテストする必要があります。(これはctrl-Z、キーボード入力の に対応します)。

于 2013-01-29T15:10:49.560 に答える
0

fgets()これにはandを使用することをお勧めしますstrtol()。Scanf と の行バッファリングはstdio一緒に使用するとあまり役に立ちません...

char line[LINE_MAX];
do {
    fgets(line, sizeof(line), stdin);
} while(!isdigit(line[0]));
int choice = strtol(line, NULL, 10);
于 2013-01-29T15:12:33.213 に答える
0

これを使って:

int e;
while ((e = scanf("%d", &rateSelected)) != EOF)
{
    scanf("%*[^\n]"); // this clean your input buffer
    if (e==0 || rateSelected>5 || rateSelected<1) {
        printf("please enter a number between 1-5:\n");
        continue;
    }

それ以外の

    while ((scanf("%d", &rateSelected)) != EOF && rateSelected != 5)
    {
        if (rateSelected > 5 || isalpha(rateSelected) ==1){
            printf("please enter a number between 1-5:\n");
        continue;
        }
于 2013-01-29T15:19:19.310 に答える