程序要求输入一个号码。如果用户键入除数字以外的任何其他内容,程序应循环scanf()
函数。
代码是,
do{
printf("Enter row number\n");
scanf("%d",&row);
}while(row>='a' && row<='z');
但上面的代码不起作用。在输入信件时我一直收到错误。我试着绕过它,整个事情无限循环。
有什么建议吗?
除非输入是INTEGER,否则我怎么能告诉C Compiler
不要打破循环?
答案 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”或某些内容,以便在您输入字符时将其从循环中解脱出来。