C语言|如何改进字符检查

4smxwvx5  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(121)

在我的程序中我想处理数字。如果用户输入的不是数字,我想让程序循环。也就是说,如果输入了“f”,“12 f”,“120941 s”,“123 a13”,它应该显示错误并要求你重新输入。我设置了一个条件,因为它也很重要。但我还需要得到另一个没有条件的数字,只要它不是一个符号。
我放了一个循环,但是如果输入第一个字符,它会给予一个错误,但是如果我输入“22 ff”,它会在一个变量中写22给我,在下一个变量中写ff(我需要得到几个带数字的变量),并创建一个错误。
我该怎么做呢?我最好把它作为一个字符串来检查吗?循环对我来说也很重要,因为我想继续工作,而不是结束程序。我会很乐意接受每一个建议!谢谢!

do {
bool valid;
        printf("Enter number x(float) ");
        while(!scanf(" %f", &x)) { 
        printf("x must be number!\nPlease, enter number! "); 
        fflush(stdin); } 

        if (x < 0) printf("\nThe number a must be positive. Try again\n");
        else valid = 0

} while (valid)
8yparm6h

8yparm6h1#

这里有一个函数,它会在一定范围内验证输入,并且没有尾随垃圾。它使用fgets,很容易就可以转储一个坏的输入并重复。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

double getdouble(double minval, double maxval)
{
    char buffer[64];        // generous
    char *endptr;           // pointer to the next character
    double inval;           // result
    
    while(1) {
        printf("Enter a double value between %f and %f: ", minval, maxval);
        if(fgets(buffer, sizeof buffer, stdin) != NULL) {
            inval = strtod(buffer, &endptr);
            // check next character, and the range of the value
            if(isspace(*endptr) && inval >= minval && inval <= maxval) {
                break;      // success
            }
        }
    }
    return inval;
}

int main(void)
{
    printf("%f\n", getdouble(1.0, 2.0));
}

程序会话:

Enter a double value between 1.000000 and 2.000000: 1.5t
Enter a double value between 1.000000 and 2.000000: 2.5
Enter a double value between 1.000000 and 2.000000: abc
Enter a double value between 1.000000 and 2.000000: 1.5
1.500000

请注意,我使用的是double,而不是float。如果没有明确的理由说明为什么不能使用double,请不要使用floatdouble是C中的自然浮点类型。

相关问题