Liju Mathew
Liju Mathew

Reputation: 899

getopt() behaviour is unusual

getopt() is not behaving as I expect for short options.

eg: Invoking the below program with a missing parameter:

Valid Case: testopt -d dir -a action -b build

Error Case: testopt -d -a action -b build

This did not throw any error as I was expecting an error message operand missing for -d

My code:

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

Upvotes: 2

Views: 1325

Answers (3)

Bobby Jack
Bobby Jack

Reputation: 16018

The above code works fine for me, using gcc 3.4.5 on Red Hat:

$ ./a.out -d test
Got d...
execution over

$ ./a.out -d
Missing operand for d
execution over

What's your environment?

UPDATE: OK, qrdl is spot on. How come getopt() works that way?

Upvotes: 0

qrdl
qrdl

Reputation: 34968

getopt() thinks -a is an argument for -d, not an option.

Try testopt -a action -b build -d - it should complain about missing argument.

You need to check for -d option (and all other options) that optarg has valid value - the one without dash in the beginning.

Upvotes: 4

unwind
unwind

Reputation: 399863

According to the manual page, you should start your option string with a colon in order to make getopt() return ':' to indicate missing argument. The default seems to be returning '?'.

Upvotes: 0

Related Questions