所以我需要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);
}
是否有可能针对重复行优化此代码?
答案 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
。