在C编程中验证整数

时间:2013-07-28 12:53:29

标签: c validation integer

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

2 个答案:

答案 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次成功转换。