【问题标题】:Fahrenheit to Celsius in C华氏度到摄氏度 C
【发布时间】:2016-10-17 21:01:12
【问题描述】:

我必须创建一个转换器,在 C 中从 F 转换为 C,反之亦然。 该程序应该有两个参数,第一个是所需的转换类型,第二个是必须转换的度数 例如:./program -f 50.0 和输出:10.00°C = 50.00°F 它还必须使用两个函数 f2c 和 c2f 来进行转换。 这是我的代码,运行良好,但由于某种原因没有访问 if,它什么也没做。

#include <stdio.h>
#include <float.h>
#include <string.h>

float c2f ( float c);
float f2c ( float f);
int main(int argc, char *argv[])
{
  char fArg = "-f";
  char cArg = "-c";

  float arg2;
  sscanf(argv[1], "%f", &arg2);
  if(strcmp(argv[0], &cArg) == 0)
  {
    float fValue = c2f(arg2);
    printf("%f C = ", arg2);
    printf("%f F\n", fValue);
  }
  else if(strcmp(argv[0], &fArg) == 0)
  {
    float cValue = f2c(arg2);
    printf("%f C = ", cValue);
    printf("%f F\n", arg2);
  }

}

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

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

【问题讨论】:

  • 如果两个if 测试都失败了,那么您就没有无条件的else 子句,并且没有任何反应。所以......添加一个else,你可能最终会得到一些输出。例如... } else { printf("No args matched\n"); } 请注意,argv[0] 是可执行文件的名称。参数从 [1]... 开始
  • 在命令行传递的第一个参数一般是argv[1]argv[0]通常是程序名)。此外,您不需要在字符串比较中使用地址运算符:strcmp(argv[0], &amp;cArg) 应该是 strcmp(argv[1], cArg)
  • 是的,如果测试都失败了,我会用另一个测试来检查。即使我将 argv[0] 更改为 argv[1] 等等,也不会发生其他任何事情。另外,如果我删除并弹出分段错误错误
  • @mateicoman 您是否还修复了fArgcArg 的定义?
  • 您是否尝试在调试器下运行程序,以便查看变量内容?这应该可以帮助你看到你的错误。

标签: c


【解决方案1】:

这里有两个问题:

首先,您尝试将字符串常量分配给单个字符:

char fArg = "-f";
char cArg = "-c";

你的编译器应该已经警告你了。将它们更改为字符数组:

char fArg[] = "-f";
char cArg[] = "-c";

并修改对strcmp 的调用以从这些变量中删除地址运算符&amp;

其次,第一个命令行参数实际上是程序的名称,而不是第一个用户参数。所以在任何你访问argv元素的地方,索引都增加1。

sscanf(argv[2], "%f", &arg2);
if(strcmp(argv[1], cArg) == 0)
...
else if(strcmp(argv[1], fArg) == 0)

【讨论】:

    猜你喜欢
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2020-08-29
    • 2017-07-24
    • 1970-01-01
    相关资源
    最近更新 更多