【发布时间】:2018-12-11 14:55:02
【问题描述】:
我目前正在大学学习 C 编程,我得到了编写一个程序的任务,该程序将任意函数 ax^2+bx+c 的 0 / x 轴的截点输出。
为了确保输入正确(int、float 等),我运行以下while 循环。在此之前,a 被定义为双精度。
printf("Input for a=");
while (scanf("%lf", &a) == 0)
{
fflush(stdin);
scanf("%lf", &a);
printf("Incorrect Input! New Input needed.\n");
printf("a=");
}
我知道fflush(stdin) 运算符仅在发生第二个输入函数时清除缓冲区,因此循环内的fflush 不会清除缓冲区,因此循环的条件始终为真,因此我创建了一个无限循环。
我的教授也禁止使用goto,这就是我在这里的原因,因为我想不出一个合理的解决方案来解决这个问题。
我也尝试过但失败了:
do
{
printf("\nInput for a= ");
scanf("%lf", &a);
}
while (isdigit(a));
{
printf("Thank you.\n");
}
通过这种安排,我收到了失败通知:Expression c >= -1 && <= 255。我想这与错误的变量定义(双精度、数字)等有关。
但是我最初的问题是是否有一个优雅的解决方案来解决这个问题,或者至少有任何解决方案。
【问题讨论】:
-
fflush(stdin)是未定义的行为,不要这样做。 -
如果您现在对整个程序感兴趣:pastebin.com/0ELkCiS7
-
在做任何其他事情之前,请正确indent您的程序。这一点很重要,对我们来说不是那么重要,而是四个你。
-
您是否在问如何使用相同的
scanf语句获取输入并区分int和float?或者,您只是想将输入限制为一个或另一个?在任何一种情况下,最好将块包含在一个连续循环中,例如for (;;) { int rtn = scanf (...); ... }验证返回 (rtn),如果输入正确,只需break;。为什么?scanf可以在失败时返回0或EOF,并且使用== 0控制循环将无法检测到EOF。 -
扫描后它就消失了。用
fgets读取一行更灵活。如果一个sscanf不起作用,您可以用另一个重试。而且很容易转储该行并阅读另一行。