我正在尝试编写一个C程序,用户必须在命令行中输入两个参数。首先,它们必须提供要读取的值的文本文件的名称。其次,它们必须提供0或1的值,它将保存为整数以用作布尔值(0 = false,1 = true)。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
FILE *f;
char *fname;
int boolVal;
if (argc != 2){
printf("This program requires two input types, data file and boolean value of 0 or 1\n");
return 1;
}
fmame = argv[1];
boolVal = argv[2];
printf("The file name is %s and the boolVal is %d.\n", fmame, boolVal);
f = fopen(fname, "r");
if (f == NULL) perror ("Could not open file");
else {
if (fgets(myStr, 1000, f) != NULL )
puts(myStr);
fclose(f);
}
return 0;
}
我收到错误:
testArg.c: In function ‘main’:
testArg.c:16: warning: assignment makes integer from pointer without a cast
我有两个问题:我的文件名是否正确?二,如何解决铸造问题?
答案 0 :(得分:3)
根据您的要求,
用户必须在命令行中输入两个参数。首先,它们必须提供要读取的值的文本文件的名称。其次,它们必须提供0或1的值,它将保存为整数以用作布尔值(0 = false,1 = true)。
您的代码应该像
一样if (argc != 3)
{ //code
记住,二进制名称也很重要。因此./<binary> <filename> <1/0>
将argc
设为3
。
接下来,代码中警告的原因是
boolVal = argv[2];
所有命令行输入都以字符串[char *
]的形式读取。如果您检查argv[2]
的数据类型,则可以轻松理解。是不是说char *
?然后,在将该值分配给int
变量之前,您需要将(alpha)数字字符串转换为整数值
所以,你需要的是
boolVal = atoi(argv[2]);
或者,甚至更好和推荐,
boolVal = strtol(argv[2], NULL, 0);
有关详细信息,请查看strtol()
的手册页。
答案 1 :(得分:2)
您正在指定bool
变量的一个指针。你必须这样做。
boolVal=atoi(argv[2]);
现在它不会发出任何警告。然后你必须检查不是argc != 3
的条件。否则它会给你一个分段错误。因为argc
将从零开始计数。如果您简单地给出./a.out
,那么argc
计数就是一个。
您是这样访问的,argv[2]
因此您必须检查argc != 3
。
int atoi(const char *nptr);
atoi
会将数组值转换为整数值。来自atoi
atoi()函数将nptr指向的字符串的初始部分转换为int。
参考here.
答案 2 :(得分:2)
将argv
中传递的字符串参数的值与1
进行比较的一种方法如下:
boolVal = argv[2][0] == '1';
然而,这是一个有效的快捷方式,因为字符串是单个字符长。对于较长的字符串,请使用strcmp
:
boolVal = strcmp(argv[2], "yes") == 0;
注意:由于位置零处的强制参数,您还应检查argc
是否为3。
答案 3 :(得分:1)
改变这个:
if (argc != 2)
对此:
if (argc != 3 || (argv[2][0] != '0' && argv[2][0] != '1') || argv[2][1] != '\0')
而且:
boolVal = argv[2];
对此:
boolVal = argv[2][0]-'0';
答案 4 :(得分:0)
此:
if (argc != 2){
应该是
if (argc != 3){
因为argv[0]
将是您运行的程序的名称,并且您还需要其他两个输入。因此,argc
的检查应该是3而不是2。
关于警告,这是因为:
boolVal = argv[2];
boolVal
的类型为int
,而argv[2]
的类型为char*
。你无法直接分配它们,这就是编译器所抱怨的。使用
sscanf(argv[2],"%d",&boolVal);
从argv[2]
中提取一个数字并将其存储在boolVal
的地址中。 sscanf
返回成功扫描和分配的项目总数。因此,您还可以使用
if(sscanf(argv[2],"%d",&boolVal)==1)
//Extraction successful!
此外,您可以使用
检查成功提取的数字是1还是0if(boolVal !=0 && boolVal !=1)
//Bad Value