Ответ 1
Вам нужно использовать atoi()
для преобразования из строки в целое.
Я прочитал пример 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[]
правильно или что-то, не уверен...
Вам нужно использовать atoi()
для преобразования из строки в целое.
Все приведенные выше ответы в целом верны (Vikram.exe получает реквизиты для объяснения, почему вы должны вызвать библиотечную функцию, которую никто не беспокоил). Однако никто не назвал нужную библиотечную функцию для вызова. Не используйте atoi
. Не используйте sscanf
.
Используйте strtol
или его относительный strtoul
если вы не хотите разрешать отрицательные числа. Только эти функции дают вам достаточно информации, когда ввод не был числом. Например, если пользователь набирает
./a.out 123cheesesandwich
atoi
и sscanf
весело вернут 123, что почти наверняка не то, что вы хотите. Только strtol
сообщит вам (через endptr
), что он обрабатывал только первые несколько символов строки.
(Нет strtoi
, но есть strtod
, если вам нужно прочитать число с плавающей запятой.)
Как вы уже использовали в своем коде, прототипом для функции main
является
int main (int argc, char** argv)
Какие аргументы аргументов приводятся в качестве аргументов командной строки, они передаются в вашу "программу" как массив из char * (или просто строк). поэтому, если вы вызываете прог как foo.exe 123
, первый аргумент foo.exe
будет строкой 123, а не целочисленным значением 123.
Если вы попытаетесь сделать аргумент целым (как вы сказали), вероятно, используя что-то вроде: (int) argv[1]
, вы не получите целочисленное значение первого аргумента, а некоторый адрес памяти, где первый arg хранится в вашем адресе пространство. Чтобы получить целочисленное значение, вы должны явно преобразовать значение строки в целочисленное значение. Для этого вы можете использовать функцию atoi
. Проверьте ЭТУ справочную страницу для аналогичных функций, которые можно использовать для преобразования.
Используйте atoi
.
cvalue = atoi( optarg );
И объявите cvalue как int
.
atoi()
, что означает, что функция ascii для integer - это функция, которую следует использовать. Аналогично, atof()
может использоваться для получения значений float.
В этой ситуации я бы пошел за sscanf()
.
Нет, вы не можете просто преобразовать его в целочисленное значение. Вам нужно преобразовать его с помощью sscanf, atoi, atol или аналогичной функции.