您忽略了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()
。
防止用户输入不正确的输入它没有任何用户的唯一的傻瓜证明的方式! – Oded 2010-05-08 19:02:08
这是C/C++吗? – IAbstract 2010-05-08 19:02:42
你为什么用'%d'读一个'char'? – kennytm 2010-05-08 19:04:23