如何将整数作为命令行参数?

时间:2011-01-25 17:14:56

标签: c command-line-arguments getopt

我已阅读a getopt() example但它没有显示如何接受整数作为参数选项,例如cvalue将在示例的代码中:

 #include <ctype.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>

 int
 main (int argc, char **argv)
 {
   int aflag = 0;
   int bflag = 0;
   char *cvalue = NULL;
   int index;
   int c;

   opterr = 0;

   while ((c = getopt (argc, argv, "abc:")) != -1)
     switch (c)
       {
       case 'a':
         aflag = 1;
         break;
       case 'b':
         bflag = 1;
         break;
       case 'c':
         cvalue = optarg;
         break;
       case '?':
         if (optopt == 'c')
           fprintf (stderr, "Option -%c requires an argument.\n", optopt);
         else if (isprint (optopt))
           fprintf (stderr, "Unknown option `-%c'.\n", optopt);
         else
           fprintf (stderr,
                    "Unknown option character `\\x%x'.\n",
                    optopt);
         return 1;
       default:
         abort ();
       }

   printf ("aflag = %d, bflag = %d, cvalue = %s\n",
           aflag, bflag, cvalue);

   for (index = optind; index < argc; index++)
     printf ("Non-option argument %s\n", argv[index]);
   return 0;
 }

如果我将上述内容作为testop -c foo运行,则cvalue将为foo,但如果我需要testop -c 42该怎么办?由于cvalue的类型为char *,我可以将optarg转换为(int)吗?我尝试过这样做而不使用getopt()并直接访问argv[whatever]并将其转换为整数,但在使用%d打印时,我总是会得到一个较大的负数。我假设我没有正确地解除引用argv[]或某些东西,不确定......

7 个答案:

答案 0 :(得分:36)

您需要使用atoi()将字符串转换为整数。

答案 1 :(得分:17)

上面的所有答案大致都是正确的(Vikram.exe获取道具用于解释为什么你必须调用库函数,没有其他人不愿意这样做)。但是,没有人将正确的库函数命名为要调用。不要使用atoi。不要使用sscanf

如果您不想允许负数,请使用strtol或其相对strtoul。当输入数字时,只有这些功能可以为您提供足够的信息。例如,如果用户键入

./a.out 123cheesesandwich

atoisscanf会愉快地返回123,这几乎肯定不是你想要的。只有strtol会告诉您(通过endptr)它只处理字符串的前几个字符。

(没有strtoi,但如果您需要读取浮点数,则有strtod。)

答案 2 :(得分:10)

正如您在代码中使用的那样,main函数的原型是

int main (int argc, char** argv)

作为命令行参数提供了什么参数,它们作为char *(或简称字符串)数组传递给你的'program'。因此,如果您将prog作为foo.exe 123调用,则foo.exe的第一个参数将是字符串123,而不是整数值123.

如果您尝试将参数转换为整数(如您所说)可能使用类似:(int) argv[1]之类的东西,则不会获得第一个参数的整数值,而是存储第一个arg的某个内存地址你的地址空间。要获取整数值,必须将字符串值显式转换为整数值。为此,您可以使用atoi功能。查看THIS手册页,了解可用于转换的类似功能。

答案 3 :(得分:4)

使用atoi

cvalue = atoi( optarg );

并将cvalue声明为int

答案 4 :(得分:4)

atoi(),表示ascii为integer是要使用的函数。同样,atof()可用于获取浮点值。

答案 5 :(得分:1)

在这种情况下,我会选择sscanf()

答案 6 :(得分:0)

不,你不能只是转换为将其转换为整数值。你需要使用sscanf,atoi,atol或类似函数对其进行转换。