Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

./a.out 123cheesesandwich

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

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

Ответ 3

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

int main (int argc, char** argv)

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

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

Ответ 4

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

cvalue = atoi( optarg );

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

Ответ 5

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

Ответ 6

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

Ответ 7

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