【问题标题】: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[] 或其他什么,不确定...

【问题讨论】:

    标签: c command-line-arguments getopt


    【解决方案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 或类似函数对其进行转换。

                【讨论】:

                  猜你喜欢
                  • 2022-01-11
                  • 2014-08-10
                  • 1970-01-01
                  • 2018-04-29
                  • 2017-04-11
                  • 1970-01-01
                  • 2015-12-22
                  相关资源
                  最近更新 更多