该程序要求的数字。 该计划应该循环的scanf()
函数,如果用户键入任何其他数字以外。
该代码是,
do{
printf("Enter row number\n");
scanf("%d",&row);
}while(row>='a' && row<='z');
但上面的代码不起作用。 在信中打字的时候我总是收到一个错误。 我试图操纵它周围整个事情无限循环。
有什么建议么?
此外,我怎么能告诉C Compiler
不打破循环,除非输入是INTEGER?
您忽略从返回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()
您将要在字符阅读,然后确定是否该字符是一个数字,并根据需要转换。 您还希望把支票像“q”或其它东西打破你跳出循环您完成输入字符时一些特殊字符。