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

C 如何防止用户输入错误的输入?,c,error-handling,C,Error Handling,程序要求输入一个数字。如果用户键入的不是数字,程序应该循环scanf()函数 代码是 do{ printf("Enter row number\n"); scanf("%d",&row); }while(row>='a' && row<='z'); do{ printf(“输入行号”); scanf(“%d”行和第行); }当(row>='a'&&row您需要读入字符,然后确定该字符是否为数字,并根据需要进行转换。您还需要检查一些特

程序要求输入一个数字。如果用户键入的不是数字,程序应该循环
scanf()
函数

代码是

 do{
     printf("Enter row number\n");
     scanf("%d",&row);
  }while(row>='a' && row<='z');
do{
printf(“输入行号”);
scanf(“%d”行和第行);

}当(row>='a'&&row您需要读入字符,然后确定该字符是否为数字,并根据需要进行转换。您还需要检查一些特殊字符,如'q'或其他一些字符,以便在输入完字符后将您从循环中分离出来。

您需要读入字符,然后确定该字符是否为数字racter是一个数字,可以根据需要进行转换。您还需要检查一些特殊字符,如“q”或其他一些字符,以便在输入完字符后将您从循环中分离出来。

您忽略了从
scanf()
返回的信息,该信息告诉您键入的信息对于转换是否准确(
%d
)或不正确。如果它不准确,您必须执行错误恢复,这对于
scanf()
来说并不特别容易。大多数人都采用“读取一行输入,然后解析它”的方法,错误恢复更简单


我知道返回值在错误检查中是必不可少的,但是我如何扫描它的数字或字母?我可以说if(input!=(integers))或类似的吗

这就是为什么人们不使用
scanf()
。如果将数据行放入缓冲区(字符数组),则可以随时检查数组的内容。如果使用
scanf()
,则在
scanf()
确定数据有错误之前,您无法可靠地处理数据

中的函数(通常也可用作宏)允许您对字符进行分类。
中的函数提供从字符串到各种整数的可靠转换

所以,你可以考虑做如下事情:

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];
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()这样的例程去做

您忽略了从
scanf()
返回的信息,该信息告诉您键入的信息对于转换是否准确(
%d
)。如果不准确,您必须执行错误恢复,这对于
scanf()来说并不特别容易
。大多数人采用“读取一行输入,然后对其进行解析”的方法,这种方法的错误恢复更简单


我知道返回值在错误检查中是必不可少的,但是我如何扫描它的数字或字母?我可以说if(input!=(integers))或类似的吗

这就是为什么人们不使用
scanf()
。如果将数据行放入缓冲区(字符数组),则可以随时检查数组的内容。如果使用
scanf()
,则在
scanf()
确定数据有错误之前,您无法可靠地处理数据

中的函数(通常也可用作宏)允许您对字符进行分类。
中的函数提供从字符串到各种整数的可靠转换

所以,你可以考虑做如下事情:

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];
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()这样的例程去做

防止用户输入错误的唯一傻瓜方法是没有任何用户!你为什么要用
%d
读取
char
?@dboarman,我是C@Kenny,我要求用户输入行数,这只是一个示例你告诉它在他们输入alpha时拾取一个数字…这没有意义任何意义。自我复制问题:防止用户输入错误的唯一简单方法是没有任何用户!你为什么要用
%d
阅读
char
?@dboarman,我是C@Kenny,我要求用户输入行数,这只是一个示例你告诉它在键入al时拾取一个数字pha…那没有任何意义。自我复制问题:谢谢你的回答,是的,我知道返回值在错误检查中是必不可少的,但是我如何扫描它的数字或字母?我能说如果(输入!=(整数))或者类似的东西?谢谢你的解释,但是这段代码我现在不太懂。有没有更简单的方法?@Zazu:解释很完整,代码也很简单。你需要重新阅读,直到你理解它。例如,thi