使用 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];

boolValint 类型,而 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';