0

如何确保用户输入的数字是仅从 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
}
4

2 回答 2

2

%d一种格式 fromscanf需要一个指向int. 所以你会写:

scanf("%d", &x);

然后可以使用scanf返回值来测试读取的数据是否与格式匹配:

if (scanf("%d", &x) != 1 || x < 0 || x > 4)
{
    /* Wrong input */
}
else
{
    /* Well-formed input */
}

阅读man scanf以获取更多信息。

于 2013-07-28T12:55:21.987 回答
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 dogs”而只是“3”)。这也允许您报告整行的错误。测试if (sscanf(line, "%d", &x) != 1)也很重要。-family 函数的成员scanf()报告成功转换规范的数量(%d是一个转换规范)。这里,如果sscanf()成功转换一个整数,则返回1;否则,它可能会返回 0 或 EOF(尽管 EOF 不太可能与sscanf())。如果有 3 个转换规范,正确的检查是!= 3; 它可能会报告 1 或 2 次成功的转换。

于 2013-07-28T13:05:14.077 回答