在C中验证用户输入

时间:2015-10-23 11:54:24

标签: c

所以我需要int的用户输入大于2。

    printf("Number of triangles (must be greater than 2) = ");
    fflush(stdin);
    scanf("%d", &num_of_triangles);
    while (num_of_triangles < 3) // ?how to check using scanf?
    {
        printf("Number of triangles (must be greater than 2) = ");
        fflush(stdin);
        scanf("%d", &num_of_triangles);
    }

是否有可能针对重复行优化此代码?

3 个答案:

答案 0 :(得分:3)

而不是while,请使用do ... while。这样,循环将至少运行一次。

num_of_triangles = 0;
do {
    printf("Number of triangles (must be greater than 2) = ");
    scanf("%d", &num_of_triangles);
    while (getchar() != '\n');    // this flushes the input buffer
} while (num_of_triangles < 3);

此外,不要fflush(stdin),因为这是未定义的行为。

编辑:

似乎Visual Studio允许fflush(stdin)。来自MSDN

  

fflush功能刷新流。如果文件关联   stream打开输出,fflush写入该文件的内容   与流关联的缓冲区。 如果流已打开   输入,fflush清除缓冲区的内容。 fflush否定了   任何先前调用ungetc对流的影响。另外,fflush(NULL)   刷新为输出打开的所有流。流后仍保持打开状态   电话。 fflush对无缓冲的流没有影响。

但一般情况下,不应依赖此行为。像上面的代码那样做一些更便携的东西是可取的。

答案 1 :(得分:1)

fflush(stdin)是未定义的行为,因此您需要完全删除它并替换其他内容。

如果失败,您还应该检查scanf的输出。

如果你想提高可读性,你也可以直接将scanf移动到你的while循环中,就像这样

while (scanf("%d",&num_of_triangles)==1 && num_of_triangles < 3)

答案 2 :(得分:0)

您可以编写代码 -

printf("Number of triangles (must be greater than 2) = ");

while (scanf("%d",&num_of_triangles)==1 && num_of_triangles < 3) //check return of scanf as well as number
{
    printf("Number of triangles (must be greater than 2) = ");       
}

循环将迭代,直到scanf成功且num_of_triangles小于3