Simple Getopt Problem (newbie question)

Dear all,

I have the following simple code that uses Getopt.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <unistd.h>
using namespace std;



int main (int argc, char* argv[]) {

 
    int option_char;     
    int tagLength = atoi(argv[1]);
    int nofTag    = atoi(argv[2]);

    while ( (option_char= getopt(argc,argv, "kn:")) !=EOF ){
            switch ( option_char ) {  
                case 'k' :  tagLength = 1;
                break;

                case 'n': nofTag = 1;     
                break;

                case '?': fprintf(stderr, "usage: %s [kn]\n", argv[0]); 
                break;
            }               /* -----  end switch  ----- */
    }

    cout << "K = " << tagLength << endl;
    cout << "N = " << nofTag << endl;


I am expecting when user pass such command:

 
./mycode -k 3 -n 10


It shall print
1
2
K = 3
N = 10


But why it prints
1
2
K = 1
N = 3
I never herd of getopt before your post, but I went to http://www.gnu.org/software/libtool/manual/libc/Example-of-Getopt.html#Example-of-Getopt
and made some modifications to their example. I was able to figure out how to print the arguments. Since I was just trying to understand how to get the arguments, I didn't bother converting them to integers.

Set if this helps with your problem:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#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 *avalue = NULL;
    char *bvalue = NULL;
    char *cvalue = NULL;
    int index;
    int c;

    opterr = 0;

    while ((c = getopt (argc, argv, "c:b:a:")) != -1)
        switch (c)
        {
        case 'a':
            aflag = 1;
            avalue = optarg;
            printf ("avalue = %s\n",avalue);

            break;
        case 'b':
            bflag = 1;
            bvalue = optarg;
            printf ("bvalue = %s\n",bvalue);
            break;
        case 'c':
            cvalue = optarg;
            printf ("cvalue = %s\n",cvalue);
            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;
}
Topic archived. No new replies allowed.