【问题标题】:While loop is not stopping when condition is met满足条件时循环不会停止
【发布时间】:2016-10-16 22:38:28
【问题描述】:

我有一个 while 循环,允许用户输入由空格分隔的任意数量的数字,并且当用户输入 0 时,程序应该在向用户显示最大数字时终止。

#include <stdio.h>

int main(){
  float fResult[100], fMax;
  int c = 1;
  while (fResult[c] != 0){
    scanf(" %f ", &fResult[c]);
    if (fResult[c] > fMax){
        fMax = fResult[c];
    }
    c = c + 1;
  }
  if (fResult[1]==0){
    printf("empty sequence");
  } else {
    printf("%.3f ", fMax);
  }
}

在用户输入一个只有负数的序列之前,它工作正常。然后结果显示为0

例如,当用户输入-3 -4 -100 -5 0 时,结果应该是-3,但我得到的是0,这在技术上是最大的数字。 但是如果用户输入0,难道不应该忽略while循环吗?

【问题讨论】:

  • 你永远不会检查scanf是否真的成功。
  • while (fResult[c] != 0)你还没有输入任何数据到fResult
  • 你还没有初始化fMax

标签: c while-loop


【解决方案1】:

fMax 初始化为读取的第一个值。无需将值保存在数组中。始终检查scanf() 的返回值。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    float f, fMax;

    if (scanf("%f", &fMax) != 1) {
        exit(EXIT_FAILURE);
    }
    if (fMax == 0.0) {
        (void) printf("empty sequence\n");
    } else {
        for (;;) {
            if (scanf("%f", &f) != 1) {
                exit(EXIT_FAILURE);
            }
            if (f == 0.0) {
                break;
            }
            if (f > fMax) {
                fMax = f;
            }
        }
        (void) printf("%.3f\n", fMax);
    }
    return 0;
}

【讨论】:

    【解决方案2】:

    在这里,您首先接受输入,然后在比较并分配给fMax 之后,您正在检查while 循环条件,这就是原因。

    在比较之前初始化 fMaxfResult[1] 并检查 c 是否大于 100 以避免数组索引越界错误。

    【讨论】:

      【解决方案3】:

      只是一个未定义行为的例子:

      fmax 在未初始化时意外为零。 未初始化时的自动变量可以具有任何垃圾值。在您的情况下为零。因此,在前四次迭代中,fmax 在与负值比较时会保持为零。

      您应该遵循以下原则:先填充 - 然后访问

      【讨论】:

        猜你喜欢
        • 2019-01-29
        • 2013-11-22
        • 1970-01-01
        • 1970-01-01
        • 2022-01-02
        • 1970-01-01
        • 2019-05-16
        • 2016-04-12
        • 2016-03-14
        相关资源
        最近更新 更多