как принимать целые числа в качестве аргументов командной строки?
я читал пример 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 ответов
все ответы выше в целом верны (Викрам.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()
, Что означает, что ascii для integer является функцией для использования. Аналогично,atof()
можно использовать для получения значений float.
нет, вы не можете просто преобразовать его в целое значение. Вам нужно преобразовать его с помощью sscanf, atoi, atol или аналогичной функции.