0

この関数は、入力を検証するために使用されます。条件を満たすまで、ユーザーに数値 (0 以上) の入力を求めます。数値の前後に文字入力がある場合、その入力は無効として扱われます。必要な出力は次のとおりです。

Enter a positive numeric number: -500
Error! Please enter a positive number:45abc
Error! Please enter a number:abc45
Error! Please enter a number:abc45abc
Error! Please enter a number:1800

まあ、それは簡単に思えます:

#include <stdio.h>
main() {
    int ret=0;
    double num;
    printf("Enter a positive number:");
    ret = scanf("%.2lf",&num);

    while (num <0 ) {
        if (ret!=1){
            while(getchar()!= '\n');
            printf("Error!Please enter a number:");
        }
        else{
            printf("Error!Please enter a positive number:");
        }
        ret = scanf("%.2lf",&num);
    }
}

Error!Please enter a number:ただし、入力の種類に関係なく、私のコードは出力され続けます。何かアドバイス?

4

2 に答える 2

3

では精度修飾子は無効ですscanf-Wallこれは、すべてのコンパイラ警告 ( gcc 内)を有効にすることで簡単に確認できます。これは、実際の値を実際に入力する方法が複数あるためです。たとえば、0.2またはを使用できます2e-1

scanf("%lf",&num)2桁だけが必要な場合は、後で数値を使用して丸めます。精度修飾子は で問題ないことに注意してくださいprintf:

#include <stdio.h>

int main() {
    int ret = 0;
    double num = -1;
    printf("Enter a positive number:");
    ret = scanf("%lf",&num);

    while (num < 0 ) {
        if (ret != 1){
            while(getchar() != '\n');
            printf("Error! Please enter a number: ");
        }
        else{
            printf("Error! Please enter a positive number: ");
        }
        ret = scanf("%lf",&num);
    }
    printf("Your number is %.2lf",num);
    return 0;
}
于 2012-06-30T21:52:56.687 に答える
1

scanf() だけを使用して必要な検証を行うのに問題があると思います。最初に文字列をスキャンしてから数値に変換することをお勧めします。ただし、scanf() は char 文字列のスキャンには危険です。その入力の長さは制限されておらず、有限長の入力バッファーへのポインターを提供する必要があるためです。入力バッファの長さを制限できる fgets() を使用することをお勧めします。

#include <stdio.h>
int main(int argc, char **argv)
{
    double num=-1;
    char input[80]; // arbitrary size buffer
    char* cp, badc; // badc is for detecting extraneous chars in the input
    int n;
    printf("Enter a positive number:");
    while (num < 0)
    {
        cp = fgets(input, sizeof(input), stdin);
        if (cp == input)
        {
            n = sscanf(input, "%lf %c", &num, &badc);
            if (n != 1) // if badc captured an extraneous char
            {
                printf("Error! Please enter a number:");
                num = -1;
            }
            else if (num < 0)
                printf("Error! Please enter a POSITIVE number:");
        }
    }

    printf("num = %f\n", num);

    return 0;
}
于 2012-06-30T21:47:30.547 に答える