使用程序参数将摄氏温度转换为华氏温度

时间:2012-10-17 10:37:39

标签: c

“对于这个程序,我想使用程序参数来收集用户数据。例如,您可以使用program -c 20进行编译,将20转换为摄氏度,并在使用program -f 20进行编译时,程序会将20转换为华氏度。该程序只接受argv[0] -c-fargv[1]将转换为浮点。以下是我的程序,我得到一些警告和错误。你能帮助我做好准备。

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


 int main(int argc, char *argv[])
 {

    const char* c = "-c";
    const char* f = "-f";

    float temp_c;


    if(0==strcmp(argv[1],c))
    { 
      sscanf(s,"%f",&temp_c);
      temp_c =  (argv[2]-32)*5/9;
      printf("%f celsius = %f fahrenheit", &temp_c, argv[2]);


    }else if(f0==strcmp(argv[1],f)){

 sscanf(s,"%f",&temp_c);
 temp_c =  argv[1]*9/5+32;
 printf("%f celsius = %f fahrenheit", &temp_c, argv[2]);

    }else

    {
      printf("please use correct flag");
      exit(0);
    }
 }

4 个答案:

答案 0 :(得分:2)

char c = "-c";
char f = "-f;

这是一个问题。 ""表示string,但您将这些变量声明为char

使用,

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

然后使用strcmp(argv[1], c)比较它们。

答案 1 :(得分:2)

这是一个错误(和实现定义的行为):

char c = "-c";
char f = "-f"; /* Note I added missing closing "/ */

更改为:

const char* c = "-c";
const char* f = "-f";

argv[0]是该计划的名称。第一个参数存储在argv[1]中。您不能使用==来比较C中字符串的内容(==比较存储字符串的数组的基址),所以这是不正确的:

if(argv[0] == c)

更改为:

if (0 == strcmp(argv[1], c))

else if条件相同。

使用scanf()而非sscanf()来检索用户输入(s未定义btw)并检查其返回值以确保为变量分配了值:

if (1 == scanf("%f", &temp_c))

最终计算错误:

temp_c =  (argv[1]-32)*5/9

更改为:

temp_c =  (temp_c-32)*5/9

其他计算相同。

答案 2 :(得分:1)

char c = "-c";
char f = "-f;

错了。这些不是字符,而是字符串,因此将它们存储为char *。字符串必须平衡。 (你自己可能发现的后一个错误。)

if(argv[0] == c)

你想要

if (strcmp(argv[1], c) == 0)

由于argv[0]是程序的名称,因此无法将字符串与==进行比较。

sscanf(s,"%f",&temp_c);

什么是s

temp_c =  (argv[1]-32)*5/9;

没有。你正在混合指针和浮点数算法。

}else if(argv([0]=f){

见上文。顺便说一句:这应该会给编译器带来语法错误;很容易被你自己发现。

sscanf(s,"%f",&temp_c);

见上文。

temp_c =  argv[1]*9/5+32;

见上文。

答案 3 :(得分:1)

截至您的代码修订版3:

mike@linux-4puc:~> gcc a.c
a.c: In function ‘main’:
a.c:29:16: error: ‘s’ undeclared (first use in this function)
a.c:29:16: note: each undeclared identifier is reported only once for each function it appears in
a.c:30:30: error: invalid operands to binary * (have ‘char *’ and ‘int’)
a.c:33:9: error: ‘f0’ undeclared (first use in this function)
a.c:35:20: error: invalid operands to binary * (have ‘char *’ and ‘int’)
a.c:40:8: warning: incompatible implicit declaration of built-in function ‘exit’ [enabled by default]

让我们来看看:

1)是的,在这里你使用s并且它没有在任何地方声明。阅读sscanf here。第一个参数是const char *,或者我们将找到内容的字符串。在您的情况下,s未声明。您想获取临时(或第二个命令行变量),因此您需要在此处传递argv[2],而不是s

sscanf(s,"%f",&temp_c);   -->  sscanf(argv[2], "%f", &temp_c);

2)同样,你正在使用尚未宣布的东西,这次是f0

else if(f0==strcmp(argv[1],f)){

在第一个if中看起来你只想要0,所以只需删除f

3)Invalid operands to binary *表示你正在尝试对字符串进行数学运算,编译器不知道该怎么做。参数argv[x]是字符串,无论你是否传递数字,所以:

temp_c =  argv[1]*9/5+32;

无效。您已经也进行了转换!这就是sscanf()为您所做的,所以您想要的值是temp_c,而不是argv[1]

4)incompatible implicit declaration of built-in function在这种情况下意味着您尝试使用标准函数exit()但未包含正确的头文件。包括<stdlib.h>将解决这个问题。


它处理警告和错误..但是你的代码仍有一些逻辑和一致性问题:

printf("%f celsius = %f fahrenheit", &temp_c, argv[2]);

这不是你想要的。不要传递temp_c的地址,你想要的是值,而不是指针的值。阅读C中的&符号,你不能随便把它们扔到任何你想要的地方。

这个语句的第二个问题是argv [2]不是一个数字,它是一个字符串(我们之前已经过了)所以你必须使用字符串格式specificer %s而不是float {{1} }。 您的%f都有同样的问题。

还有一个问题,您的printf函数应返回main,这就是int的含义。在您离开该功能之前,您应该确保有int main(...return 0;您有一个,但前提是您属于exit(0);案例。你应该在函数的末尾无条件地拥有一个。