如何防止用户输入不正确的输入?(How to prevent users from typing i

2019-10-21 15:02发布

该程序要求的数字。 该计划应该循环的scanf()函数,如果用户键入任何其他数字以外。

该代码是,

 do{
     printf("Enter row number\n");
     scanf("%d",&row);
  }while(row>='a' && row<='z');

但上面的代码不起作用。 在信中打字的时候我总是收到一个错误。 我试图操纵它周围整个事情无限循环。

有什么建议么?

此外,我怎么能告诉C Compiler不打破循环,除非输入是INTEGER?

Answer 1:

您忽略从返回scanf()它告诉你输入的信息是否准确进行转换( %d )或没有。 如果它是不准确的,你所要做的错误恢复,这是特别不容易与scanf() 。 大多数人去的方法“读取一行输入,然后解析它,在错误恢复更加简单。


据我所知,返回值在错误检查必不可少,但我怎么如果它的数字或字母扫描? 我可以说,如果(输入!=(整数))或任何类似?

这就是为什么人们不使用scanf() 如果你的数据线到缓冲区(字符数组),那么你可以经常为你喜欢检查数组的内容。 如果您使用scanf()你没有得到一个可靠的机会来处理数据后才scanf()决定有错误。

在功能(通常也可作为宏) <ctype.h>允许你分类字符。 在功能<stdlib.h>于各种种类的整数提供从串可靠转换。

所以,你可以考虑一下做这样的事情:

char buffer[256];

while (fgets(buffer, sizeof(buffer), stdin))
{
    ...check contents of buffer using isdigit() etc...
    ...or just plough ahead with...
    long value;
    char *end;
    errno = 0;
    value = strtol(buffer, &end, 0);
    if (errno != 0 || (*end != '\0' && !isspace(*end))
        ...diagnose problems...
}

此代码是有点出我的联赛,此刻..有一个简单的方法?

好吧,我想你可以使用atoi()而不是strtol()简化了错误处理(因为它是不太精确):

char buffer[256];

while (fgets(buffer, sizeof(buffer), stdin))
{
    int value = atoi(buffer);
    if (value == 0)
    {
        puts("zero read - exiting loop");
        break;
    }
}

它没有得到比这更简单。 我不知道你觉得超出你之前的解决方案的哪一部分。 替代方案,在我看来,是多fiddlier,涉及阅读一次一个字符和保存数字,并拒绝非数字:

char buffer[256];
char *dst = buffer;
int c;
int value;

while ((c = getchar()) != EOF)
{
    if (isdigit(c))
    {
        *dst++ = c;  /* Ignoring buffer overflow - bad! */
    }
    else if (isspace(c))
    {
        *dst = '\0';
        value = atoi(buffer);
        break;
    }
    else
    {
        printf("Unexpected character '%c'!\n", c);
    }
}

等等。 存在这样的代码来解决各种问题 - 比如一个错误的文字后重置指针,避免缓冲区溢出,并处理上的数字标牌,和...嗯,东西各种各样,我宁愿离开例程像fgets()strtol()



Answer 2:

您将要在字符阅读,然后确定是否该字符是一个数字,并根据需要转换。 您还希望把支票像“q”或其它东西打破你跳出循环您完成输入字符时一些特殊字符。



文章来源: How to prevent users from typing incorrect inputs?