22

我已经阅读了一个 getopt() 示例,但它没有显示如何接受整数作为参数选项,就像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 foocvalue将会是foo,但是如果我想要testop -c 42呢?既然cvalueis 的类型char *,我可以直接optarg转换为 be(int)吗?我试过这样做而不直接使用getopt()和访问argv[whatever],并将其转换为整数,但在使用%d. 我假设我没有argv[]正确取消引用或其他东西,不确定......

4

7 回答 7

38

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

于 2011-01-25T17:18:20.163 回答
23

上面的所有答案都大体上是正确的(Vikram.exe 得到了解释为什么你必须调用一个库函数的道具,而没有其他人愿意这样做)。但是,没有人指定要调用的正确库函数。不要使用atoi. 不要使用sscanf.

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

./a.out 123cheesesandwich

atoi并且sscanf会高兴地返回 123,这几乎肯定不是你想要的。Onlystrtol会告诉你(通过endptr)它只处理了字符串的前几个字符。

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

于 2011-01-25T17:55:38.417 回答
11

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

int main (int argc, char** argv)

作为命令行参数提供的任何参数,它们都作为 char * (或简单的字符串)数组传递给您的“程序”。所以如果你调用一个 prog as foo.exe 123,第一个参数foo.exe将是一个字符串 123 而不是一个整数值 123。

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

于 2011-01-25T17:30:25.073 回答
5

使用atoi.

cvalue = atoi( optarg );

并将 cvalue 声明为int.

于 2011-01-25T17:18:21.797 回答
4

atoi(),这意味着 ascii 到整数是要使用的函数。同样,atof()可用于获取浮点值。

于 2011-01-25T18:26:13.340 回答
1

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

于 2011-01-25T17:19:06.297 回答
0

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

于 2011-01-25T17:19:55.220 回答