如何检测用户在C中的无效输入



我需要编写一个代码,向用户询问3-69之间的数字。如果输入不正确,我必须在stderr中打印"wrong input"(如果它是一个字母(或"out of range"(如果它不属于间隔(。

我可以处理"out of range"stderr,但不能处理另一个。当我输入一个字母时,它会自动转换成一些大数字,我想这是内存中的地址或其他什么。在这种情况下,stderr变为"out of range",而不是"wrong input"。有办法解决它吗?

也许我把变量引入int是错误的?(这些是获得输入的代码行(:

int x, y;
scanf("%i %i",&x,&y);

当我输入一个字母时,它会自动转换成一些大数字,我想这是内存中的地址或其他什么。

这是xy中的垃圾。

scanf("%i %i",&x,&y);说要寻找两个整数。如果scanf没有看到两个整数,它将失败,并且不会向xy写入任何内容。因为您没有检查scanf是否成功,所以当您读取xy时,它们将被取消初始化;它们将包含当时内存中的任何垃圾。

最简单的方法是首先检查scanf是否成功。然后检查数字是否在正确的范围内。为了便于说明,我将把这个问题简化为一个数字。

#include <stdio.h>
int main() {
int num;
while(1) {
if( scanf("%i ",&num) != 1 ) {
fprintf(stderr, "Please enter a number.n");
continue;
}
if( num < 3 || 69 < num ) {
fprintf(stderr, "The number must be between 3 and 69.n");
continue;
}
break;
}
printf("Your number is %i.n", num);
}

但当用户输入"a"时,这将进入一个无限循环。

$ ./test
a
Please enter a number.
Please enter a number.
Please enter a number.

scanf失败时,它将用户的输入留在stdin上。上述程序将一次又一次地读取相同的a。这是scanf的一个常见问题,它是为结构良好的输入而设计的,而用户输入不是结构良好的。有关scanf的更多问题,请参阅C常见问题解答。

相反,请分别读取和解析。用fgets读整行,用sscanf解析,如果不是你想要的,就读另一行。

#include <stdio.h>
int main() {
int num;
char line[1024];
while(fgets(line, sizeof(line), stdin)) {
if( sscanf(line, "%i ",&num) != 1 ) {
fprintf(stderr, "Please enter a number.n");
continue;
}
if( num < 3 || 69 < num ) {
fprintf(stderr, "The number must be between 3 and 69.n");
continue;
}
break;
}
printf("Your number is %i.n", num);
}

相关内容

  • 没有找到相关文章

最新更新