поведение getopt () необычно - PullRequest
2 голосов
/ 05 ноября 2008

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;
}

Ответы [ 3 ]

4 голосов
/ 05 ноября 2008

getopt() считает -a аргументом для -d, а не опцией.

Попробуйте testopt -a action -b build -d - он должен жаловаться на отсутствие аргумента.

Вам необходимо проверить для опции -d (и всех других опций), что optarg имеет допустимое значение - значение без черты в начале.

0 голосов
/ 05 ноября 2008

Приведенный выше код отлично работает для меня, используя 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 () работает таким образом?

0 голосов
/ 05 ноября 2008

Согласно странице руководства , вы должны начать строку параметров с двоеточия, чтобы getopt() возвратил ':', чтобы указать отсутствующий аргумент. Кажется, по умолчанию возвращается '?'.

...