getopt() ведет себя не так, как я ожидал от коротких опций.
например: Вызов программы ниже с отсутствующим параметром:
Действительный случай: testopt -d dir -a action -b build
Случай ошибки: testopt -d -a action -b build
Это не привело к ошибке, так как я ожидал, что операнд сообщения об ошибке отсутствует для -d.
Мой код:
#include <unistd.h>
/* testopt.c */
/* Test program for testing getopt */
int main(int argc, char **argv)
{
int chr;
while ( ( chr = getopt(argc, argv, ":d:a:b:") ) != -1 )
{
switch(chr)
{
case 'a':
printf("Got a...\n");
break;
case 'b':
printf("Got b...\n");
break;
case 'd':
printf("Got d...\n");
break;
case ':':
printf("Missing operand for %c\n", optopt);
break;
case '?':
printf("Unknown option %c\n", optopt);
break;
}
}
printf("execution over\n");
return 0;
}





Согласно страница руководства, вы должны начинать строку параметров с двоеточия, чтобы getopt() возвращал ':' для указания отсутствующего аргумента. По умолчанию, похоже, возвращается '?'.
getopt() считает, что -a - это аргумент в пользу -d, а не вариант.
Попробуйте testopt -a action -b build -d - он должен пожаловаться на пропущенный аргумент.
Вам нужно проверить параметр -d (и все другие параметры), что optarg имеет допустимое значение - то есть без тире в начале.
Вызов не находится под контролем программы, поэтому я думаю, что проверка того, является ли первый символ "-", является решением, как вы сказали.
Приведенный выше код отлично работает для меня, используя gcc 3.4.5 в Red Hat:
$ ./a.out -d test
Got d...
execution over
$ ./a.out -d
Missing operand for d
execution over
Какая у вас среда?
ОБНОВИТЬ: Хорошо, qrdl на высоте. Почему так работает getopt ()?
Я изменил эту опцию, но она ведет себя точно так же.