【问题标题】:While loop doesn't break no matter what I do [closed]无论我做什么,循环都不会中断[关闭]
【发布时间】:2016-03-16 07:14:40
【问题描述】:

我有这段代码,问题是无论我给“m”什么值,while 都在循环,我不知道为什么

这里是代码

#include <stdio.h>
#include <math.h>
#include <conio.h>

int main(void){
    float ur, N, h1, h2, h3, l1, l2, l3, uo, w, V, i, lc1, lc2, A1, A2, A3, A4, R1, R2, R3, R4, Req, fl, P;
    int m;
    uo = 4*M_PI*(pow(10, -7));
    printf("\n-- Inicio del Problema --");
    printf("\n-- Para conocer las variables revise la imagen en la parte trasera de la portada del disco --");
    while (m != 1){
        printf("\n-- Introduzca Permeabilidad magnetica relativa\t");
        scanf("%f", &ur);
        printf("\n-- Introduzca voltaje en volts\t");
        scanf("%f", &V);
        printf("\n-- Introduzca corriente en amperes\t");
        scanf("%f", &i);
        printf("\n-- Introduzca el número de espiras\t");
        scanf("%f", &N);
        printf("\n-- Introduzca las alturas en metros (h1, h2 y h3 separados por espacio)\t");
        scanf("%f %f %f", &h1, &h2, &h3);
        printf("\n-- Introduzca los largos en metros (l1, l2, y l3 separados por espacio)\t");
        scanf("%f %f %f", &l1, &l2, &l3);
        printf("\n-- Introduzca la anchura en metros (w)\t");
        scanf("%f", &w);
        printf("\nur = %f \t V = %f V \t I = %f A \t N = %f espiras \nh1 = %f m \t h2 = %f m \t h3 = %f m \nl1 = %f m \t l2 = %f m \t l3 = %f m \t w = %f m", ur, V, i, N, h1, h2, h3, l1, l2, l3, w);
        printf("\nHa introducido correctamente los datos (si = 1, no = 2)? \t");
        scanf("%d", m);     
    }
    lc1 = l2+(l1/2)+(l3/2);
    lc2 = h2+(h1/2)+(h3/2);
    A1 = h1*w;
    A2 = l3*w;
    A3 = h3*w;
    A4 = l1*w;
    R1 = lc1/(ur*uo*A1);
    R2 = lc2/(ur*uo*A2);
    R3 = lc1/(ur*uo*A3);
    R4 = lc2/(ur*uo*A4);
    Req = R1+R2+R3+R4;
    fl = (N*i)/Req;
    P = V*i;
    printf("\n-- Las áreas son: \nA1 = %f m^2 \nA2 = %f m^2 \nA3 = %f m^2 \nA4 = %f m^2", A1, A2, A3, A4);
    printf("\n-- Las reluctancias son: \nR1 = %f A*V/wb \nR2 = %f A*V/wb \nR3 = %f A*V/wb \nR4 = %f A*V/wb", R1, R2, R3, R4);
    printf("\n-- La reluctancia equivalente es: \nReq = %f A*V/wb", Req);
    printf("\n-- El flujo magnetomotriz es: \nF = %f wb", fl);
    printf("\n-- La potencia del sistema es: \nP = %f watts", P);
    getch(); 
    return 0;
}

我已尝试更改为“m == 2”,并进行了一段时间的操作。无论我做什么,要么不回答任何问题,要么不回答任何问题。

我也尝试过在循环中添加 if/break,包括 while 和 do-while,但仍然有同样的问题

如果你指出我的问题,我真的很感激

【问题讨论】:

  • scanf("%d", m); --> scanf("%d", &amp;m); 也初始化m 例如int m=0;
  • 使用do...while 循环而不是while 循环。
  • 投票关闭是一个简单的错字,因为另一个“forgot & in scanf”问题并没有为网站增加任何价值。我会以重复的形式关闭,但懒得找一个。

标签: c while-loop


【解决方案1】:

变化:

scanf("%d", m);

到:

scanf("%d", &m);

原来的样子,m 没有改变(它正在写入内存中的某个不安全地址)。

您的编译器应该对此有警告,因此请确保您已启用编译器警告。

另外,您需要为m 分配一个初始值,可能为零,以强制第一次进入循环。

【讨论】:

    【解决方案2】:

    有两个问题:

    • 您正在使用未初始化的m
    • 最后一条语句scanf("%d", m); 应该是scanf("%d", &amp;m);。请注意m 之前的&amp;

    其中任何一个都会导致未定义的行为。但是,循环无限的一个可能原因是scanf("%d", m); 将输入存储到地址m 而不是m 的地址。因此,m 可以具有不确定的值,它可能不等于 1,并导致表达式 m != 1 始终为 true


    推荐阅读:What will happen if '&' is not put in a 'scanf' statement in C?.

    【讨论】:

      【解决方案3】:

      尝试以下更正:

      1) 初始化 m(如果您希望执行 while 循环,则初始化为不同于 1 的值)。

      2) 将 scanf("%d", m); 更改为 scanf("%d", &amp;m); 以便读入您在条件中使用的相同变量。

      【讨论】:

        【解决方案4】:

        我觉得这条线有问题

        scanf("%d", m);
        

        这会将值设置到值为 m 的地址中,而不是将值设置为 m。

        正确的应该是

        scanf("%d", &m);
        

        【讨论】:

          猜你喜欢
          • 2022-11-14
          • 2016-07-14
          • 2016-10-30
          • 2011-04-26
          • 1970-01-01
          • 1970-01-01
          • 2019-09-06
          • 2015-08-25
          • 2021-03-08
          相关资源
          最近更新 更多