簡體   English   中英

函數和指針

[英]function and pointers

我正在嘗試編寫一個將攝氏度轉換為華氏度,反之亦然的程序。 我的程序正在編譯,但是它給我錯誤的結果。 我一直在嘗試通過更改指針來更改它,但是它不起作用。 誰能給我指出我的問題是什么? 在我看來,它在聲明和指針中,但是我不確定。謝謝!

#include<stdio.h>

float f2c(float f);
float c2f(float c);

int main(void)
{
 float cel;
 float celcius;
 float fahren;
 float fah;
 char ch;
 float number;

scanf("%c %f", &ch, &number);

if(&ch == "-f"){
  f2c(number);
  celcius=f2c(number);
  printf("%f", celcius);
  }

 else{
  c2f(number);
  fahren = c2f(number);
  printf("%f", fahren);
  }

return 0;
}

float f2c(float f)
{
 float cel = (f - 32) * 5/9;
 return cel;
} 

float c2f(float c)
{
 float fah = (9 * c/5 + 32);
 return fah;
}

if(&ch == "-f")這是問題所在。 它應該是 :

if(ch == 'f')

您正在將char與C字符串"-f" 使用strcmp比較C字符串。

您可能還已將ch聲明為char數組,用於此處需要的多個字符。 因為,您不能像現在那樣在單個字符中存儲“ -f”。

隨着更改:

#include<stdio.h>

float f2c(float f);
float c2f(float c);

int main(void)
{
 float cel;
 float celcius;
 float fahren;
 float fah;
 char ch[25];
 float number;

scanf("%s %f", ch, &number);

if(strcmp(ch,"-f")==0){
  f2c(number);
  celcius=f2c(number);
  printf("%f", celcius);
  }

 else{
  c2f(number);
  fahren = c2f(number);
  printf("%f", fahren);
  }

return 0;
}

float f2c(float f)
{
 float cel = (f - 32) * 5/9.0;
 return cel;
} 

float c2f(float c)
{
 float fah = (9 * c/5.0 + 32);
 return fah;
}

這本質上是您的代碼,但對其進行了修改以將輸入讀取為C字符串。

除了其他答案:

您正在對轉換函數進行不必要的調用,並丟棄結果,就在再次進行相同的調用之前,但正確地處理了返回值:

if(&ch == "-f"){
  f2c(number);  /* This line does absolutely nothing! */
  celcius=f2c(number);
  printf("%f", celcius);
  }

使用浮點算術,而不是整數算術,因為在整數算術中5/9為0。因此,您可以對代碼進行此更改(盡管float參數是不尋常的):

float f2c(float f)
{
 return  (f - 32.0) * 5.0/9.0;
} 

float c2f(float c)
{
 return 9.0 * c/5.0 + 32.0;
}

同樣,作為其他答案之一,條件(&ch == "-f")永遠都不成立。

這是一個完整的工作示例,其中包含錯誤檢查。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <errno.h>
#include <assert.h>

static double f2c(double f)
{
 return (f - 32.0) * 5.0/9.0;
} 

static double c2f(double c)
{
 return 9.0 * c/5.0 + 32.0;
}

int main (int argc, char *argv[])
{
 int i;
 const char *label_f = "Fahrenheit";
 const char *label_c = "Celcius";
 const char *from, *to;
 double (*conversion)(double);

 from = label_c;
 to = label_f;
 conversion = c2f;

 for (i=1; i<argc; ++i)
   {
     if (0 == strcmp(argv[i], "-f"))
       {
         from = label_f;
         to = label_c;
         conversion = f2c;
       }
     else if (0 == strcmp(argv[i], "-c"))
       {
         from = label_c;
         to = label_f;
         conversion = c2f;
       }
     else
       {
         char *suffix = NULL;
         double temp_in;

         errno = 0;
         temp_in = strtod(argv[i], &suffix);

         if (ERANGE == errno)
           {
             if (HUGE_VAL == temp_in) 
               {
                 fprintf(stderr, "%s is too big", argv[i]);
                 return 1;
               }
             else
               {
                 assert(-HUGE_VAL == temp_in);
                 fprintf(stderr, "%s is too small", argv[i]);
                 return 1;
               }
           }
         else if (errno != 0 && (suffix == argv[i]))
           {
             /* no conversion was performed. */
             fprintf(stderr, "%s is not a number", argv[i]);
             return 1;
           }
         else if (*suffix) 
           {
             fprintf(stderr, "Expected a number but saw '%s'\n", argv[i]);
             return 1;
           }
         else
           {
             const double temp_out = (*conversion)(temp_in);
             printf("%f %s is %f %s.\n", temp_in, from, temp_out, to);
           }
       }
   }
 return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM