Jump to content
    1. Welcome to GTAForums!

    1. GTANet.com

    1. GTA Online

      1. Los Santos Drug Wars
      2. Updates
      3. Find Lobbies & Players
      4. Guides & Strategies
      5. Vehicles
      6. Content Creator
      7. Help & Support
    2. Red Dead Online

      1. Blood Money
      2. Frontier Pursuits
      3. Find Lobbies & Outlaws
      4. Help & Support
    3. Crews

    1. Grand Theft Auto Series

      1. Bugs*
      2. St. Andrews Cathedral
    2. GTA VI

    3. GTA V

      1. Guides & Strategies
      2. Help & Support
    4. GTA IV

      1. The Lost and Damned
      2. The Ballad of Gay Tony
      3. Guides & Strategies
      4. Help & Support
    5. GTA San Andreas

      1. Classic GTA SA
      2. Guides & Strategies
      3. Help & Support
    6. GTA Vice City

      1. Classic GTA VC
      2. Guides & Strategies
      3. Help & Support
    7. GTA III

      1. Classic GTA III
      2. Guides & Strategies
      3. Help & Support
    8. Portable Games

      1. GTA Chinatown Wars
      2. GTA Vice City Stories
      3. GTA Liberty City Stories
    9. Top-Down Games

      1. GTA Advance
      2. GTA 2
      3. GTA
    1. Red Dead Redemption 2

      1. PC
      2. Help & Support
    2. Red Dead Redemption

    1. GTA Mods

      1. GTA V
      2. GTA IV
      3. GTA III, VC & SA
      4. Tutorials
    2. Red Dead Mods

      1. Documentation
    3. Mod Showroom

      1. Scripts & Plugins
      2. Maps
      3. Total Conversions
      4. Vehicles
      5. Textures
      6. Characters
      7. Tools
      8. Other
      9. Workshop
    4. Featured Mods

      1. Design Your Own Mission
      2. OpenIV
      3. GTA: Underground
      4. GTA: Liberty City
      5. GTA: State of Liberty
    1. Rockstar Games

    2. Rockstar Collectors

    1. Off-Topic

      1. General Chat
      2. Gaming
      3. Technology
      4. Movies & TV
      5. Music
      6. Sports
      7. Vehicles
    2. Expression

      1. Graphics / Visual Arts
      2. GFX Requests & Tutorials
      3. Writers' Discussion
      4. Debates & Discussion
    1. Announcements

    2. Support

    3. Suggestions

Happy Holidays from the GTANet team!

getopt() option requires argument


Saggy
 Share

Recommended Posts

I'm trying to use the getopt() function in glibc to parse through command line options. Here is the man page here. http://linux.die.net/man/3/getopt

 

It says that "optstring" holds characters for options that are valid, and if they are followed by a ':' they require an argument. The only problem is in my code, only the last option character in optstring will trip an error message for a missing argument. If "optstring" starts with a ':' then it returns ':' for any option missing an argument, and '?' for any option character it does not recognize.

 

This is my code, and option 'f' is the only one that will return a ':' if it lacks its option argument. I'm not sure how many people are even familiar with getopt() here but maybe they can read that man page and spot something I'm missing...

 

 

while ((opt = getopt(argc, argv, "n:p:x:f:hard")) != -1)       {               switch(opt)               {                       case 'h':                               printSyntax("passmanager");                               return 1;                       break;                       case 'a':                               options.Add = 1;                       break;                       case 'r':                               options.Read = 1;                       break;                       case 'd':                               options.Delete = 1;                       break;                       case 'f':                               if(options.Add == 1)                                      passWordFile = fopen(optarg, "ab");                               if(options.Read == 1)                                       passWordFile = fopen(optarg, "rb");                               if(options.Delete == 1)                               {                                       passWordFile = fopen(optarg, "rb+");                                       strcpy(options.passWordFileName, optarg);                               }                       break;                       case 'n':                               if(optarg[0] == '-')                               {                                       printf("Option -n requires an operand\n");                                       errflg++;                               }                               else                                       options.entrySearch = 1;                               if(strlen(optarg) > 24)                               {                                       printf("entry name too long");                                       printSyntax("passmanager");                                       return 1;                               }                               strcpy(entryName, optarg);                       break;                       case 'p':                               if(optarg[0] == '-')                               {                                       printf("Option -p requires an operand\n");                                       errflg++;                               }                               if(strlen(optarg) > 24)                               {                                       printf("password too long");                                       printSyntax("passmanager");                                       return 1;                               }                               strcpy(passWord, optarg);                       break;                       case 'x':                               if(optarg[0] == '-')                               {                                       errflg++;                                       printf("Option -x requires an operand\n");                               }                               strcpy(xcetPass, optarg);                       break;                       case ':':                               printf("Option -%c requires an operand\n", optopt);                               errflg++;                       break;                       case '?':                               if (optopt == 'n')                                      fprintf (stderr, "Option -%c requires an argument.\n", optopt);                               if (optopt == 'f')                                      fprintf (stderr, "Option -%c requires an argument.\n", optopt);                               if (optopt == 'x')                                      fprintf (stderr, "Option -%c requires an argument.\n", optopt);                               if (optopt == 'p')                                      fprintf (stderr, "Option -%c requires an argument.\n", optopt);                               else                                      printf("Unrecognized option: -%c\n", optopt);                               errflg++;               }       }       if(errflg)       {               printSyntax("passmanger");               return 1;       }

 

 

So far I've modified the way to parse the commands so that each case argument checks for an argument value instead of relying on getopt() to do it, but I would like to know why it's not working correctly.

QUOTE (K^2) ...not only is it legal for you to go around with a concealed penis, it requires absolutely no registration!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • 1 User Currently Viewing
    0 members, 0 Anonymous, 1 Guest

×
×
  • Create New...

Important Information

By using GTAForums.com, you agree to our Terms of Use and Privacy Policy.