我在使用下面的代码时出现问题,当我输入一封信时,isdigit无法检测到它并收到错误消息"没有输入"
int age;
char buffer[100] = "";
printf("Enter your age: ");
fgets(buffer, 100, stdin);
age = atoi(buffer);
printf("%d\n",age);
if (age == NULL)
{
printf("Nothing entered\n");
}
else if (isdigit(age) == 0)
{
printf("Not a number\n");
}
else if (age <1 || age > 110)
{
printf("Out of range\n");
}
else
{
printf("Thank you\n");
}
答案 0 :(得分:2)
而不是
age = atoi(buffer);
printf("%d\n",age);
if (age == NULL)
{
printf("Nothing entered\n");
}
使用
if ( sscanf(buffer, "%d", &age) != 1 )
{
printf("Nothing entered\n");
}
else
{
printf("%d entered\n", age);
}
答案 1 :(得分:2)
atoi
是错误的功能。
使用strtol()
(man page)代替,这允许进行广泛的错误检查。
此外,请检查 fgets()
的返回值。
char buf[100];
if (fgets(buf, sizeof buf, stdin)) {
char *end;
errno = 0;
long n = strtol(buf, &end, 10);
// check for errors
if (n == 0 || n == LONG_MIN || n == LONG_MAX) {
if (errno != 0) {
printf("Erroneous input entered\n");
} else {
// process valid input
}
} else {
// process valid input
}
} else {
printf("nothing was entered\n");
}
顺便说一句,将int
与NULL
(指针)进行比较是没有意义的。如果这不至少触发编译器警告(更好的是,硬错误),则需要提高编译器警告级别或更改为现代编译器。
答案 2 :(得分:0)
行为解释
atoi("x")
将返回0.这是因为第一个非数字
上的atoi停止if (age == NULL)
然后为真,因为NULL定义为0(基本上)
你应该首先检查缓冲区,然后执行atoi