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

Posted

技术标签:

【中文标题】如何将整数作为命令行参数?【英文标题】:how to take integers as command line arguments? 【发布时间】:2011-06-15 08:43:04 【问题描述】:

我已阅读 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 怎么办?由于cvaluechar * 类型,我可以将optarg 转换为(int) 吗?我尝试过不使用getopt() 直接访问argv[whatever] 并将其转换为整数,但在使用%d 打印时总是得到一个很大的负数。我假设我没有正确取消引用 argv[] 或其他什么,不确定...

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

./a.out 123cheesesandwich

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

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

【讨论】:

【参考方案3】:

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

int main (int argc, char** argv)

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

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

【讨论】:

【参考方案4】:

使用atoi

cvalue = atoi( optarg );

并将 cvalue 声明为 int

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

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

【讨论】:

以上是关于如何将整数作为命令行参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何将两个整数参数传入并使用 C# 命令行程序? [复制]

如何使用 argparse 将列表作为命令行参数传递?

如何将字符串语句作为命令行参数传递

我应该如何将密码(包含特殊字符)作为命令行参数传递?

python argh/argparse:如何将列表作为命令行参数传递?

如何检查命令行参数是不是为整数