“对于这个程序,我想使用程序参数来收集用户数据。例如,您可以使用program -c 20
进行编译,将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);
}
}
答案 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);
案例。你应该在函数的末尾无条件地拥有一个。