【问题标题】:How to pass this number between functions? C如何在函数之间传递这个数字? C
【发布时间】:2014-09-05 19:38:10
【问题描述】:

好吧,我对 C 语言有点困惑。
我需要创建一个函数,从用户那里获取一个数字并将其发送到其他几个函数(取决于哪个函数正在运行)。
没有它,这些函数看起来像这样

void deflator(FILE** fw_vystup) {
    float ipd, n_hdp = 0.0f, r_hdp = 0.0f;
    do {
        printf("Type in a GDP: ");
        if (1 != scanf("%f", &n_hdp)) {
            vyprazdni_buffer(); // this is just cleaning the buffer
            continue;
        }
    } while (n_hdp <= 0);
    ...

所以我是这样设计的

void zadani_cisla(float cislo) {
    do {
        printf("Wrong input!");
        if (1 != scanf("%f", &cislo)) {
            vyprazdni_buffer();
        }
    } while (cislo <= 0);
}
void deflator(float cislo, FILE** fw_vystup) {
    float ipd, n_hdp = 0.0f, r_hdp = 0.0f;
    do {
        printf("Zadejte nominalni domaci produkt daneho roku: ");
        zadani_cisla(cislo);
        n_hdp = cislo;

    } while (n_hdp <= 0);

它仍然说输入错误,因为我输入的数字我猜没有获得。 你能看出问题吗?提前致谢。

【问题讨论】:

  • 请使用英文的字符串和标识符!
  • @BasileStarynkevitch:他为什么要那样做?他应该使用他习惯的标识符名称。
  • 因为代码是给SO读者的留言,我们用英文看这个论坛! (但我不是以英语为母语的人)。

标签: c numbers arguments parameter-passing var


【解决方案1】:

您没有通过引用传递您的号码。例如,您需要在函数deflator 中更改以下内容:

zadani_cisla(cislo);

zadani_cisla(&cislo);  /* pass by reference */

这样,函数zadani_cisla 中该变量的任何更改都将在deflator 中看到

同样在zadani_cisla 中,您需要更改以下行:

if (1 != scanf("%f", &cislo)) {
        vyprazdni_buffer();
    }

if (1 != scanf("%f", cislo)) {
        vyprazdni_buffer();
    }

因为变量cisla 已经是一个指针变量。您还需要更改zadani_cisla 的定义

【讨论】:

    【解决方案2】:

    在这个循环中:

     void zadani_cisla (float cislo)
     {
         do {
            printf("Wrong input!");
            if (1 !=  scanf("%f", &cislo)) {
                 vyprazdni_buffer();
            }
         } while (cislo <= 0);
     }
    

    printf 总是至少发生一次。 您的第二个问题是浮点数在 C 中按值传递,因此 zadani_cisla 无法更改调用它的函数中的 cislo。

    更好:

     void zadani_cisla (float * cislo)
     {
         do {
            if ((1 == scanf("%f", cislo)) && (*cislo > 0)) break;
            vyprazdni_buffer();
            printf("Wrong input!");
         } while (1);
     }
    
     zadani_cisla(&cislo);
    

    【讨论】:

      【解决方案3】:

      你可以有一个函数返回一些浮点数:

      float ask_float(void) {
        float f = 0.0;
        do {
         if (scanf("%f", &f)<=0) 
            printf("wrong float:\n");
         else return f;
        } while(true);
      }
      

      您将用作:

      float f;
      f= ask_float();
      

      或者你可以传递一个指针:

      void do_ask_float (float*pf) {
        do 
         if (scanf("%f", pf)<=0) 
            printf("wrong float:\n");
         else return;
        } while(true);
      }
      

      你可以这样称呼它:

      float f =0.0;
      do_ask_float(&f);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多