0

I am trying to write a C program, 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).

#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;
}

I get an error:

testArg.c: In function ‘main’:
testArg.c:16: warning: assignment makes integer from pointer without a cast

I have two questions: Is my reading in of the file name correct? Second, how to solve the issue of casting?

4

5 回答 5

3

按照您的要求,

用户必须在命令行中输入两个参数。首先,它们必须提供要读取的值的文本文件的名称。其次,它们必须提供 0 或 1 的值,将其保存为整数以用作布尔值(0=false,1=true)。

你的代码应该是这样的

if (argc != 3)
{  //code

请记住,二进制名称也很重要。所以./<binary> <filename> <1/0>使argcas 3

接下来,代码中出现警告的原因是

boolVal = argv[2];

char *所有命令行输入都以字符串 [ ]的形式读取。如果您检查argv[2]. 不是说char *吗?然后,您需要将该(字母)数字字符串转换为整数值,然后再将该值分配给int变量。

所以,你需要的是

boolVal = atoi(argv[2]);

或者,甚至更好和推荐,

boolVal = strtol(argv[2], NULL, 0);    

有关详细信息,请查看手册页strtol()

于 2015-03-24T12:31:13.990 回答
2

您正在为该bool变量分配一个指针。你必须这样做。

boolVal=atoi(argv[2]);

现在它不会抛出任何警告。然后你必须检查条件不是 as argc != 3。否则它会给你一个分段错误。因为argc将从零开始计数。如果你很简单,./a.out那么argc计数就是一。

你是这样访问的,argv[2]所以你必须检查一下argc != 3

 int atoi(const char *nptr);

atoi将数组值转换为整数值。从手册页atoi

atoi() 函数将 nptr 指向的字符串的初始部分转换为 int。

参考这里。

于 2015-03-24T12:31:24.020 回答
2

argv比较传入to的字符串参数的值的一种方法1如下:

boolVal = argv[2][0] == '1';

然而,这是一个有效的快捷方式,因为字符串是单个字符长。对于更长的字符串,使用strcmp

boolVal = strcmp(argv[2], "yes") == 0;

注意:您还应该检查它argc是 3,因为位置为零的强制参数。

于 2015-03-24T12:33:04.627 回答
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';
于 2015-03-24T12:46:02.870 回答
0

这个:

if (argc != 2){

应该

if (argc != 3){

argv[0]将是您运行的程序的名称,并且您还需要另外两个输入。因此,检查argc应该是 3 而不是 2。

至于警告,是因为这里:

boolVal = argv[2];

boolVal是类型intargv[2]而是类型char*。您不能直接分配它们,这就是编译器所抱怨的。利用

sscanf(argv[2],"%d",&boolVal);

从中提取一个数字argv[2]并将其存储在 的地址中boolValsscanf返回成功扫描和分配的项目总数。因此,您还可以使用以下方法检查提取是否成功

if(sscanf(argv[2],"%d",&boolVal)==1)
    //Extraction successful!

此外,您可以使用以下方法检查成功提取的数字是 1 还是 0

if(boolVal !=0 && boolVal !=1)
    //Bad Value
于 2015-03-24T12:34:19.993 回答