Thread: the best way to check if command line argumets are valid

  1. #1
    Registered User
    Join Date
    Apr 2007
    Location
    Finland
    Posts
    16

    the best way to check if command line argumets are valid

    I'm creating little comman line app and I'm using getopt to parse the command line arguments. Now i'm trying to find the best/easiest way to check if the arguments are valid...

    what I mean is. My app accepts this: ./d -a -t 2007-07-27 -d "something" what I want to do is that if the user puts for example ./d -a -d "Math exam" -t 2007-07-27 or something else the app won't do anything else than tells that it's wrong and quits. i still want to accept other arguments like ./d -r 002 and ./d -m 002 -t 2007-08-01.

    Any ideas?

  2. #2
    Registered User Mortissus's Avatar
    Join Date
    Dec 2004
    Location
    Brazil, Porto Alegre
    Posts
    152
    int getopt(int argc, char * const argv[], const char *optstring);

    It works on Linux and gcc on Windows.

    Edit: I am pasting an example from the man page itself:
    Code:
    #include <stdio.h>     /* for printf */
    #include <stdlib.h>    /* for exit */
    #include <getopt.h>
    
    int
    main (int argc, char **argv) {
    	int c;
    	int digit_optind = 0;
    
    	while (1) {
    		int this_option_optind = optind ? optind : 1;
    		int option_index = 0;
    		static struct option long_options[] = {
    			{"add", 1, 0, 0},
    			{"append", 0, 0, 0},
    			{"delete", 1, 0, 0},
    			{"verbose", 0, 0, 0},
    			{"create", 1, 0, 'c'},
    			{"file", 1, 0, 0},
    			{0, 0, 0, 0}
    		};
    
    		c = getopt_long (argc, argv, "abc:d:012",
    				 long_options, &option_index);
    		if (c == -1)
    			break;
    
    		switch (c) {
    		case 0:
    			printf ("option &#37;s", long_options[option_index].name);
    			if (optarg)
    				printf (" with arg %s", optarg);
    			printf ("\n");
    			break;
    
    		case '0':
    		case '1':
    		case '2':
    			if (digit_optind != 0 && digit_optind != this_option_optind)
    				printf ("digits occur in two different argv-elements.\n");
    			digit_optind = this_option_optind;
    			printf ("option %c\n", c);
    			break;
    
    		case 'a':
    			printf ("option a\n");
    			break;
    
    		case 'b':
    			printf ("option b\n");
    			break;
    
    		case 'c':
    			printf ("option c with value '%s'\n", optarg);
    			break;
    
    		case 'd':
    			printf ("option d with value '%s'\n", optarg);
    			break;
    
    		case '?':
    			break;
    
    		default:
    			printf ("?? getopt returned character code 0%o ??\n", c);
    		}
    	}
    
    	if (optind < argc) {
    		printf ("non-option ARGV-elements: ");
    		while (optind < argc)
    			printf ("%s ", argv[optind++]);
    		printf ("\n");
    	}
    
    	exit (0);
    }
    Last edited by Mortissus; 07-26-2007 at 07:19 AM. Reason: Edit

  3. #3
    Registered User
    Join Date
    Apr 2007
    Location
    Finland
    Posts
    16
    hmm, I'm not familiar with getopt_long()... Any good site where I could find how it works? Of course someone can explaine it here

  4. #4
    Registered User Mortissus's Avatar
    Join Date
    Dec 2004
    Location
    Brazil, Porto Alegre
    Posts
    152

  5. #5
    Registered User
    Join Date
    Apr 2007
    Location
    Finland
    Posts
    16
    Ok, I still can't really find the answer to my original question. I have for example situation:

    Code:
    while ((c= getopt (argc, argv, "atd:")) != -1)
    
    switch(c) {
     case a:
      write something to file...
    
     case t:
      write something to file...
    
     case d:
      write something to file...
    To get the right format to the file you need to use command line arguments in specific order, like : /d -a -t 2007-07-27 -d "something" if the order is wrong then it won't write anything the the file.

    I need to find the best way to check that out.
    Last edited by Tehy; 07-26-2007 at 10:37 AM.

  6. #6
    Lurking whiteflags's Avatar
    Join Date
    Apr 2006
    Location
    United States
    Posts
    9,612
    If getopt can't do what you need to be done, then you should parse argv yourself and determine if it's correct and in the right order, or whatever else you're looking for.

    But I don't understand. If -t requires -a, then a switch statement using output from getopt should be all that you need, because -t should make an error if -a wasn't done first. If that is not the case, then why should -t require -a? Don't force an order of options if you don't need one.

  7. #7
    Registered User
    Join Date
    Apr 2007
    Location
    Finland
    Posts
    16
    The order need to be a, t, d because that's the only way to get the right format to the file. For example: ./d -a -t 2007-07-27 -d "something" writes 001;2007-07-27;Something to the file. So if the user uses these arguments in wrong order or leave out some argument it doesn't work...

    I hope you understand what I mean
    Last edited by Tehy; 07-26-2007 at 11:03 AM.

  8. #8
    Registered User Mortissus's Avatar
    Join Date
    Dec 2004
    Location
    Brazil, Porto Alegre
    Posts
    152
    ¬¬

    You can solve this problem with simple programming. Create variables for each information you need to write. Perform the while-switch to read the options and assign the options to the variables. Verify if all options are filled, if not, tell it to the user and leave. Otherwise, proceed to write the variables in the correct order.

  9. #9
    Registered User
    Join Date
    Apr 2007
    Location
    Finland
    Posts
    16
    Quote Originally Posted by Mortissus View Post
    ¬¬

    You can solve this problem with simple programming. Create variables for each information you need to write. Perform the while-switch to read the options and assign the options to the variables. Verify if all options are filled, if not, tell it to the user and leave. Otherwise, proceed to write the variables in the correct order.
    Ok, I just wanted to ask if there's some easier to way to do it Thanks! I'll try!

  10. #10
    Registered User Mortissus's Avatar
    Join Date
    Dec 2004
    Location
    Brazil, Porto Alegre
    Posts
    152
    Well, if you need to impose a specific option order, it doesn't make much sense to use options. I believe that the idea behind the options is the possibility to specify them (or not) in any order.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. recursion error
    By cchallenged in forum C Programming
    Replies: 2
    Last Post: 12-18-2006, 09:15 AM
  2. Please check this loop
    By Daesom in forum C++ Programming
    Replies: 13
    Last Post: 11-02-2006, 01:52 AM
  3. Check application visibility
    By 3saul in forum Linux Programming
    Replies: 2
    Last Post: 02-13-2006, 05:13 PM
  4. Thank you so much...
    By ta1samail in forum C++ Programming
    Replies: 0
    Last Post: 10-10-2001, 08:49 PM
  5. check my code ( if statement, file existance )
    By Shadow in forum C Programming
    Replies: 1
    Last Post: 10-04-2001, 11:13 AM