从您的代码的修订版 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
情况。您应该无条件地在函数末尾添加一个。