#### 25.2.2 Example of Parsing Arguments with `getopt`

Here is an example showing how `getopt` is typically used. The key points to notice are:

- Normally, `getopt` is called in a loop. When `getopt` returns `-1`, indicating no more options are present, the loop terminates.
- A `switch` statement is used to dispatch on the return value from `getopt`. In typical use, each case just sets a variable that is used later in the program.
- A second loop is used to process the remaining non-option arguments.

         #include <ctype.h>
         #include <stdio.h>
         #include <stdlib.h>
         #include <unistd.h>

         int
         main (int argc, char **argv)
         {
           int aflag = 0;
           int bflag = 0;
           char *cvalue = NULL;
           int index;
           int c;

           opterr = 0;

           while ((c = getopt (argc, argv, "abc:")) != -1)
             switch (c)
               {
               case 'a':
                 aflag = 1;
                 break;
               case 'b':
                 bflag = 1;
                 break;
               case 'c':
                 cvalue = optarg;
                 break;
               case '?':
                 if (optopt == 'c')
                   fprintf (stderr, "Option -%c requires an argument.\n", optopt);
                 else if (isprint (optopt))
                   fprintf (stderr, "Unknown option `-%c'.\n", optopt);
                 else
                   fprintf (stderr,
                            "Unknown option character `\\x%x'.\n",
                            optopt);
                 return 1;
               default:
                 abort ();
               }

           printf ("aflag = %d, bflag = %d, cvalue = %s\n",
                   aflag, bflag, cvalue);

           for (index = optind; index < argc; index++)
             printf ("Non-option argument %s\n", argv[index]);
           return 0;
         }

Here are some examples showing what this program prints with different combinations of arguments:

         % testopt
         aflag = 0, bflag = 0, cvalue = (null)

         % testopt -a -b
         aflag = 1, bflag = 1, cvalue = (null)

         % testopt -ab
         aflag = 1, bflag = 1, cvalue = (null)

         % testopt -c foo
         aflag = 0, bflag = 0, cvalue = foo

         % testopt -cfoo
         aflag = 0, bflag = 0, cvalue = foo

         % testopt arg1
         aflag = 0, bflag = 0, cvalue = (null)
         Non-option argument arg1

         % testopt -a arg1
         aflag = 1, bflag = 0, cvalue = (null)
         Non-option argument arg1

         % testopt -c foo arg1
         aflag = 0, bflag = 0, cvalue = foo
         Non-option argument arg1

         % testopt -a -- -b
         aflag = 1, bflag = 0, cvalue = (null)
         Non-option argument -b

         % testopt -a -
         aflag = 1, bflag = 0, cvalue = (null)
         Non-option argument -