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

я читал пример 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 = %sn",
           aflag, bflag, cvalue);

   for (index = optind; index < argc; index++)
     printf ("Non-option argument %sn", argv[index]);
   return 0;
 }

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

7 ответов


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


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

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

./a.out 123cheesesandwich

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

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


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

int main (int argc, char** argv)

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

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


использовать atoi.

cvalue = atoi( optarg );

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


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


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


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