我需要编写一个代码,向用户询问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);
当我输入一个字母时,它会自动转换成一些大数字,我想这是内存中的地址或其他什么。
这是x
和y
中的垃圾。
scanf("%i %i",&x,&y);
说要寻找两个整数。如果scanf
没有看到两个整数,它将失败,并且不会向x
或y
写入任何内容。因为您没有检查scanf
是否成功,所以当您读取x
和y
时,它们将被取消初始化;它们将包含当时内存中的任何垃圾。
最简单的方法是首先检查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);
}