使用 C 的参数输入来转换问题
Casting issues using argument input from C
我正在尝试编写一个 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
我有两个问题:我读入的文件名是否正确?二、如何解决铸造问题?
根据您的要求,
where a user must input two arguments into the command line. First, they must provide a name of a text file of values to be read. Second, they must provide a value of 0 or 1, which will be saved as an integer to be used as a boolean (0=false, 1=true).
你的代码应该像
if (argc != 3)
{ //code
记住,二进制名称也很重要。所以 ./<binary> <filename> <1/0>
使 argc
成为 3
.
接下来,您的代码中出现警告的原因是
boolVal = argv[2];
所有命令行输入都以字符串形式读取[char *
]。如果您检查argv[2]
的数据类型,您可以很容易地理解这一点。不是说char *
吗?然后,您需要 convert that (alpha)numeric string to an integer value before you assign that int
变量的值。
那么,你需要的是
boolVal = atoi(argv[2]);
或者,更好和推荐,
boolVal = strtol(argv[2], NULL, 0);
有关详细信息,请查看 strtol()
的手册页。
您正在为 bool
变量分配一个指针。你必须这样做。
boolVal=atoi(argv[2]);
现在它不会抛出任何警告。然后你必须检查不是 argc != 3
的条件。否则它会给你一个分段错误。因为 argc
将从零开始计数。如果您简单地给出 ./a.out
那么 argc
计数就是一。
您是这样访问的,argv[2]
所以您必须检查argc != 3
。
int atoi(const char *nptr);
atoi
会将数组值转换为整数值。来自 atoi
的手册页
The atoi() function converts the initial portion of the string pointed to by nptr to int.
参考here.
将 argv
中传递的字符串参数的值与 1
进行比较的一种方法如下:
boolVal = argv[2][0] == '1';
然而,这是一个可行的快捷方式,因为该字符串只有一个字符长。对于更长的字符串,使用 strcmp
:
boolVal = strcmp(argv[2], "yes") == 0;
注意:您还应该检查 argc
是否为三,因为位置零处的强制参数。
这个:
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
returns 成功扫描和分配的项目总数。因此,您还可以使用
检查提取是否成功
if(sscanf(argv[2],"%d",&boolVal)==1)
//Extraction successful!
此外,您可以使用
检查成功提取的数字是1还是0
if(boolVal !=0 && boolVal !=1)
//Bad Value
改变这个:
if (argc != 2)
为此:
if (argc != 3 || (argv[2][0] != '0' && argv[2][0] != '1') || argv[2][1] != '[=11=]')
还有这个:
boolVal = argv[2];
为此:
boolVal = argv[2][0]-'0';
我正在尝试编写一个 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
我有两个问题:我读入的文件名是否正确?二、如何解决铸造问题?
根据您的要求,
where a user must input two arguments into the command line. First, they must provide a name of a text file of values to be read. Second, they must provide a value of 0 or 1, which will be saved as an integer to be used as a boolean (0=false, 1=true).
你的代码应该像
if (argc != 3)
{ //code
记住,二进制名称也很重要。所以 ./<binary> <filename> <1/0>
使 argc
成为 3
.
接下来,您的代码中出现警告的原因是
boolVal = argv[2];
所有命令行输入都以字符串形式读取[char *
]。如果您检查argv[2]
的数据类型,您可以很容易地理解这一点。不是说char *
吗?然后,您需要 convert that (alpha)numeric string to an integer value before you assign that int
变量的值。
那么,你需要的是
boolVal = atoi(argv[2]);
或者,更好和推荐,
boolVal = strtol(argv[2], NULL, 0);
有关详细信息,请查看 strtol()
的手册页。
您正在为 bool
变量分配一个指针。你必须这样做。
boolVal=atoi(argv[2]);
现在它不会抛出任何警告。然后你必须检查不是 argc != 3
的条件。否则它会给你一个分段错误。因为 argc
将从零开始计数。如果您简单地给出 ./a.out
那么 argc
计数就是一。
您是这样访问的,argv[2]
所以您必须检查argc != 3
。
int atoi(const char *nptr);
atoi
会将数组值转换为整数值。来自 atoi
The atoi() function converts the initial portion of the string pointed to by nptr to int.
参考here.
将 argv
中传递的字符串参数的值与 1
进行比较的一种方法如下:
boolVal = argv[2][0] == '1';
然而,这是一个可行的快捷方式,因为该字符串只有一个字符长。对于更长的字符串,使用 strcmp
:
boolVal = strcmp(argv[2], "yes") == 0;
注意:您还应该检查 argc
是否为三,因为位置零处的强制参数。
这个:
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
returns 成功扫描和分配的项目总数。因此,您还可以使用
if(sscanf(argv[2],"%d",&boolVal)==1)
//Extraction successful!
此外,您可以使用
检查成功提取的数字是1还是0if(boolVal !=0 && boolVal !=1)
//Bad Value
改变这个:
if (argc != 2)
为此:
if (argc != 3 || (argv[2][0] != '0' && argv[2][0] != '1') || argv[2][1] != '[=11=]')
还有这个:
boolVal = argv[2];
为此:
boolVal = argv[2][0]-'0';