如何确保用户输入的数字是仅从 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 到 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
}
第%d
一种格式 fromscanf
需要一个指向int
. 所以你会写:
scanf("%d", &x);
然后可以使用scanf
返回值来测试读取的数据是否与格式匹配:
if (scanf("%d", &x) != 1 || x < 0 || x > 4)
{
/* Wrong input */
}
else
{
/* Well-formed input */
}
阅读man scanf
以获取更多信息。
如果输入应该是该行上的单个数字,则:
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 dogs”而只是“3”)。这也允许您报告整行的错误。测试if (sscanf(line, "%d", &x) != 1)
也很重要。-family 函数的成员scanf()
报告成功转换规范的数量(%d
是一个转换规范)。这里,如果sscanf()
成功转换一个整数,则返回1;否则,它可能会返回 0 或 EOF(尽管 EOF 不太可能与sscanf()
)。如果有 3 个转换规范,正确的检查是!= 3
; 它可能会报告 1 或 2 次成功的转换。