#include <stdlib.h>
int getopt(int argc, char * const *argv, const char *optstring);
extern char *optarg; extern int optind, opterr, optopt;
Unsafe
optstring must contain the option letters the command using getopt() will recognize; if a letter is followed by a colon, the option is expected to have an argument, or group of arguments, which may be separated from it by white space. optarg is set to point to the start of the option argument on return from getopt().
getopt() places in optind the argv index of the next argument to be processed. optind is external and is initialized to 1 before the first call to getopt(). When all options have been processed (that is, up to the first non-option argument), getopt() returns EOF . The special option ‘--’ (two hyphens) may be used to delimit the end of the options; when it is encountered, EOF is returned and ‘--’’ is skipped. This is useful in delimiting non-option arguments that begin with ‘‘-’’ (hyphen).
#include <stdlib.h> #include <stdio.h> main (int argc, char **argv) { int c; extern char *optarg; extern int optind; int aflg = 0; int bflg = 0; int errflg = 0; char *ofile = NULL; while ((c = getopt(argc, argv, "abo:")) != EOF) switch (c) { case ’a’: if (bflg) errflg++; else aflg++; break; case ’b’: if (aflg) errflg++; else bflg++; break; case ’o’: ofile = optarg; (void)printf("ofile = %s\n", ofile); break; case ’?’: errflg++; } if (errflg) { (void)fprintf(stderr, "usage: cmd [-a|-b] [-o <filename>] files...\n"); exit (2); } for ( ; optind < argc; optind++) (void)printf("%s\n", argv[optind]); return 0; }
The library routine getopt() does not fully check for mandatory arguments. That is, given an option string a:b and the input -a -b, getopt() assumes that -b is the mandatory argument to the -a option and not that -a is missing a mandatory argument.
It is a
violation of the command syntax standard (see intro(1)
) for options with
arguments to be grouped with other options, as in cmd -abo filename , where
a and b are options, o is an option that requires an argument, and filename
is the argument to o. Although this syntax is permitted in the current implementation,
it should not be used because it may not be supported in future releases.
The correct syntax to use is: