如何防止用户输入错误的输入?

时间:2010-05-08 18:59:51

标签: c error-handling

程序要求输入一个号码。如果用户键入除数字以外的任何其他内容,程序应循环scanf()函数。

代码是,

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

但上面的代码不起作用。在输入信件时我一直收到错误。我试着绕过它,整个事情无限循环。

有什么建议吗?

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

2 个答案:

答案 0 :(得分:3)

您忽略了scanf()的回复,它会告诉您输入的信息是否准确(%d)。如果不准确,则必须进行错误恢复,scanf()并不是特别容易。大多数人都采用“读取一行输入然后解析它”的方法,错误恢复更简单。


  

我理解返回值在错误检查中是必不可少的,但如何扫描其数字或字母?我可以说if(input!=(整数))或类似的东西吗?

这就是人们不使用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;
    }
}

它没有比这简单得多。我不知道你觉得以前解决方案的哪一部分超出了你的范围。在我看来,替代方案非常简洁,包括一次读取一个字符并保存数字并拒绝非数字:

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()

答案 1 :(得分:0)

您需要读入字符,然后确定该字符是否为数字并根据需要进行转换。您还需要检查某些特殊字符,例如“q”或某些内容,以便在您输入字符时将其从循环中解脱出来。