使用C中的参数输入来转换问题

时间:2015-03-24 12:29:36

标签: c string command-line-arguments compiler-warnings strtol

我正在尝试编写一个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

我有两个问题:我的文件名是否正确?二,如何解决铸造问题?

5 个答案:

答案 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还是0
if(boolVal !=0 && boolVal !=1)
    //Bad Value