C中的输入数据验证

时间:2012-06-30 21:02:28

标签: c validation

该函数用于验证输入。它会提示用户输入一个数值(大于或等于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:。有什么建议吗?

2 个答案:

答案 0 :(得分:3)

精度修饰符在scanf中无效。您可以通过启用所有编译器警告(gcc中的-Wall)轻松验证这一点。这样做的原因是实际输入实际值有多种方法,例如您可以使用0.22e-1

如果您只需要2位数,只需使用scanf("%lf",&num)然后将数字四舍五入。请注意,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;
}

答案 1 :(得分: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;
}