как взять целые числа в качестве аргументов командной строки?

c command-line-arguments getopt

78098 просмотра

7 ответа

Я прочитал пример 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[]правильно или что-то, не уверен ...

Автор: Andrew Источник Размещён: 12.11.2019 09:28

Ответы (7)


36 плюса

Решение

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

Автор: Vlad H Размещён: 25.01.2011 05:18

18 плюса

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

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

./a.out 123cheesesandwich

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

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

Автор: zwol Размещён: 25.01.2011 05:55

11 плюса

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

int main (int argc, char** argv)

Какие бы аргументы ни указывались в качестве аргументов командной строки, они передаются вашей «программе» в виде массива char * (или просто строк). так что если вы вызываете прогу как foo.exe 123, первым аргументом foo.exeбудет строка 123, а не целочисленное значение 123.

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

Автор: Vikram.exe Размещён: 25.01.2011 05:30

4 плюса

Использование atoi.

cvalue = atoi( optarg );

И объявить cvalue как int.

Автор: Mark Loeser Размещён: 25.01.2011 05:18

4 плюса

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

Автор: Sulla Размещён: 25.01.2011 06:26

1 плюс

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

Автор: stefan Размещён: 25.01.2011 05:19

0 плюса

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

Автор: Pablo Santa Cruz Размещён: 25.01.2011 05:19
Вопросы из категории :
32x32