如何验证用户输入是否仅包含 C 中的数字?

问题描述 投票:0回答:1

我正在编写提示用户输入数字的代码。如果输入是非数字的,它会循环回到提示。我在尝试验证输入是否仅包含数字字符时遇到了困难。到目前为止,我的代码似乎只检查输入的第一个字符。例如:

545454 从循环中断。 54545j 从循环中断。 asdfgh 循环回到提示符。 a54545 循环回到提示符。

任何包含字符的输入都应返回到提示。

这是我指的循环:

    int a;
    int b;
    char buffer[100];
    long long ccnum;
    
    do
    {
        printf("Please input the credit card number: ");
        fgets( buffer, sizeof(buffer), stdin );
    }
    while ( sscanf( buffer, "%lld", &ccnum) != 1 );

我只是想了解为什么无论输入中非数字字符的位置如何,它都不会循环回提示。我是否至少在正确的轨道上获得了我正在寻找的验证?

任何帮助表示赞赏。

c validation scanf fgets
1个回答
2
投票

你的测试只检查输入是否以数字开头,它会接受初始空格和一个可选的符号,这也应该是无效的。

您可以为此使用

sscanf()
,但格式不同:

  • %*[0-9]
    读取并丢弃所有数字(至少一个),然后
  • %n
    将找到的位数设置为
    int
    变量和
  • %1[\n]
    正好读取一个换行符。

如果

sscanf()
返回
1
,则换行符已经找到,
len
包含找到的位数。如果返回值不是
1
,则输入不完全由数字组成或为空行。

测试

fgets()
失败也需要检测和报告文件结束。

这里是修改版:

    char buffer[100];
    char eol[2];
    int len;
    
    for (;;) {
        printf("Please input the credit card number: ");
        if (!fgets(buffer, sizeof(buffer), stdin)) {
            printf("unexpected end of file\n");
            exit(1);
        }
        if (sscanf(buffer, "%*[0-9]%n%1[\n]", &len, eol) != 1) {
            printf("invalid input: must only contain digits\n");
            continue;
        }
        if (len != 13 && len != 16) {
            printf("credit card number must have 13 or 16 digits\n");
            continue;
        }
        break;
    }

@Fe2O3 所建议,您可以使用

sscanf()
中的
strspn()
代替
<string.h>
来实施相同的测试:

        // counts the number of digits at the beginning of buffer
        len = strspn(buffer, "0123456789");
        if (buffer[len] != '\n') {
            printf("invalid input: must only contain digits\n");
            continue;
        }
© www.soinside.com 2019 - 2024. All rights reserved.