如何确保用户输入的数字仅为0到4之间的整数,并确保它是非负数/非符号/字母?
如果我这样做,那么它将无法验证字母/符号
printf("Enter number 0 to 4");
scanf("%d",x);
if((x<0)||(x>4))
{
printf("0 to 4 only");
scanf("%d",x);
}
else
{
xxxxxx
}
答案 0 :(得分:2)
来自%d
的第一个scanf
格式需要指向int
的指针。所以你会写:
scanf("%d", &x);
然后,您可以使用scanf
返回值:
if (scanf("%d", &x) != 1 || x < 0 || x > 4)
{
/* Wrong input */
}
else
{
/* Well-formed input */
}
阅读man scanf
了解更多信息。
答案 1 :(得分:2)
如果输入应该是该行的单个数字,那么:
char line[4096];
int x;
if (fgets(line, sizeof(line), stdin) == 0)
...EOF or other major trouble...
else if (sscanf(line, "%d", &x) != 1)
...not an integer...
else if (x < 0)
...negative - not allowed...
else if (x > 4)
...too large - maximum is 4...
else
...Hooray - number is valid in the range 0-4...use it...
您可以选择如何处理错误。第一次错误处理应该放弃从用户那里获取号码的努力;其他三个可以保证重试(但要注意你允许的重试次数;如果他们连续10次错误,可能是时候放弃了。)
关键是代码使用fgets()
来获取整行,然后解析它。可以进行进一步的分析 - 确保线上没有额外的信息(因此用户没有输入'3只狗'而不只是'3')。这也允许您报告整行的错误。 if (sscanf(line, "%d", &x) != 1)
的测试也很重要。 scanf()
- 函数系列的成员报告成功转换规范的数量(%d
是转换规范)。在这里,如果sscanf()
成功转换整数,它将返回1;否则,它可能返回0或EOF(尽管sscanf()
不太可能有EOF)。如果有3个转换规范,则正确的检查将是!= 3
;它可能会报告1或2次成功转换。