Подпись getopt()
является
int getopt(int argc, char * const argv[], const char *optstring);
В optstring
должны быть указаны символы опции. За символом опции следует одиночный :
, только если ему всегда требуется аргумент. Для необязательного аргумента используются две точки с запятой, а для тех, у кого всегда нет аргументов, точка с запятой отсутствует.
Вам нужна опция -s
, которая принимает целочисленный аргумент.
При использовании getopt()
есть две другие опции d
и m
, которые не принимают аргумент (я предположил, что m
не принимает аргумент, как вы хотели ./mycat -s 16 foo
для компиляции . Если хотите, измените его на необязательный аргумент.
То есть getopt()
должно быть
while ((opt = getopt(argc, argv, "dms:")) != -1) {
....
....
}
И в case 's':
оператора switch
case 's':
iopt = strtol(optarg, &dp, 10);
if(iopt==0 && errno == ERANGE)
{
errno = 0;
perror("Number out of range");
}
else if(*dp != 0)
{
printf("\nNot a numeric value. Non number part found");
}
break;
optarg
будет указывать на начало строки, которая является аргументом опции s
.
Так как он нужен нам как число, вам нужно преобразовать строку в число.
strtol()
используется для этого. В случае успеха возвращает номер типа long
.
Если число слишком велико, чтобы содержаться в long
, оно возвращает 0
и устанавливает errno
в ERANGE
. Чтобы проверить эти коды ошибок, необходимо указать errno.h
.
Вы можете использовать другие функции в том же семействе, что и strtol()
, чтобы получить значения других типов. Например: strtoll()
для long long
.