0

“对于这个程序,我想使用程序参数来收集用户数据。例如,你可以用program -c 20which编译将20转换为摄氏度,当编译时program -f 20,程序会将20转换为华氏度。程序只能接受argv[0]-c-f, 并将argv[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

4 回答 4

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

这是个问题。""意味着string 但您将这些变量声明为char

利用,

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

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

于 2012-10-17T10:40:48.153 回答
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(), notsscanf()来检索用户输入(s顺便说一句未定义)并检查其返回值以确保为变量分配了一个值:

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

最终计算不正确:

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

改成:

temp_c =  (temp_c-32)*5/9

其他计算相同。

于 2012-10-17T10:45:09.367 回答
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 在这里阅读。第一个参数是 a 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)){

看起来你只是想要 0 就像第一个一样if,所以只需删除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] 不是一个数字,它是一个字符串(我们之前已经讨论过)所以你必须使用特定的字符串格式而%s不是 float %f。你的两个相同printf的问题。

还有一个问题,你的main函数应该返回一个int,这就是int main(...意思。在你离开这个功能之前,你应该确保有一个return 0;exit(0);你有一个,但前提是你陷入了这种else情况。您应该无条件地在函数末尾添加一个。

于 2012-10-17T12:05:30.017 回答
1
char c = "-c";
char f = "-f;

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

if(argv[0] == c)

这里你要

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

asargv[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;

看上面。

于 2012-10-17T10:44:43.627 回答