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