как взять целые числа в качестве аргументов командной строки? - PullRequest
19 голосов
/ 25 января 2011

Я прочитал пример 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 foo, cvalue будет foo, но что, если я хотел бы testop -c 42?Поскольку cvalue имеет тип char *, могу ли я просто разыграть optarg, чтобы он был (int)?Я пытался сделать это, не используя getopt() и не обращаясь непосредственно к argv[whatever], и приводя его к целому числу, но я всегда получаю большое отрицательное число при печати с %d.Я предполагаю, что не разыменую argv[] правильно или что-то, не уверен ...

Ответы [ 7 ]

36 голосов
/ 25 января 2011

Вам нужно использовать atoi() для преобразования из строки в целое число.

18 голосов
/ 25 января 2011

Все ответы, приведенные выше, в целом правильны (Vikram.exe получает реквизиты для объяснения , почему вам нужно вызывать библиотечную функцию, что никто больше не удосужился сделать) Однако никто не назвал правильную библиотечную функцию для вызова. Не используйте atoi. Не используйте sscanf.

Используйте strtol или его относительное strtoul, если вы не хотите разрешать отрицательные числа. Только эти функции дают вам достаточно информации, когда ввод был , а не число. Например, если пользователь вводит

./a.out 123cheesesandwich

atoi и sscanf будут весело возвращать 123, что почти наверняка не то, что вы хотите. Только strtol скажет вам (через endptr), что он обработал только первые несколько символов строки.

(Нет strtoi, но есть strtod, если вам нужно прочитать число с плавающей запятой.)

11 голосов
/ 25 января 2011

Как вы уже использовали в своем коде, прототип для функции main имеет вид

int main (int argc, char** argv)

Все аргументы, которые предоставляются в качестве аргументов командной строки, передаются в ваш'program' - массив символов char * (или просто строк).поэтому, если вы вызываете прогу как foo.exe 123, первым аргументом foo.exe будет строка 123, а не целочисленное значение 123.

Если вы попытаетесь привести аргумент к целому числу (как вы сказали)вероятно, используя что-то вроде: (int) argv[1], вы не получите целочисленное значение первого аргумента, но какой-то адрес памяти, где первый аргумент хранится в вашем адресном пространстве.Чтобы получить целочисленное значение, вы должны явно преобразовать строковое значение в целочисленное значение.Для этого вы можете использовать функцию atoi.Проверьте справочную страницу THIS на наличие похожих функций, которые можно использовать для преобразования.

4 голосов
/ 25 января 2011

atoi(), что означает использование функции от целого до целого числа.Аналогично, atof() может использоваться для получения значений с плавающей запятой.

4 голосов
/ 25 января 2011

Используйте atoi.

cvalue = atoi( optarg );

И объявите значение как int.

1 голос
/ 25 января 2011

В этой ситуации я бы пошел на sscanf().

0 голосов
/ 25 января 2011

Нет, вы не можете просто преобразовать его в целочисленное значение. Вам нужно преобразовать его, используя sscanf, atoi, atol или аналогичную функцию.

...