使用getopt函数对windows命令行程序进行参数解析

getopt()是libc的标准函数,很多语言中都能找到它的移植版本。

// -b -p "c:input" -o "e:	estoutput"

bool bBinary = false;
char szPath[MAX_PATH] = {0};
char szOput[MAX_PATH] = {0};

int c = 0;
while ((c = getopt(argc, argv, "bp:o:")) != -1) 
{
    switch (c) 
    {
    case 'b':
        bBinary = true;
        
        break;
    case 'p':
        {
            memcpy(szPath, optarg, strlen(optarg));
        }
        break;
    case 'o':
        {
            memcpy(szOput, optarg, strlen(optarg));
        }
        break;
    case '?':
        break;
    default:
        printf ("?? getopt returned character code %c ??", (char)c);
    }
}

getopt()的核心是一个类似printf的格式字符串的命令行参数描述串,
如上的"bp:o:"定义了b, p,o三个命令行参数,
其中,b不需要参数,p和o需要跟参数。

/*** wingetopt.h ***/

/*
POSIX getopt for Windows

  AT&T Public License
  
    Code given out at the 1985 UNIFORUM conference in Dallas.  
*/

#ifdef __GNUC__
#include <getopt.h>
#endif
#ifndef __GNUC__

#ifndef _WINGETOPT_H_
#define _WINGETOPT_H_

#ifdef __cplusplus
extern "C" {
#endif
    
    extern int opterr;
    extern int optind;
    extern int optopt;
    extern char *optarg;
    extern int getopt(int argc, char **argv, char *opts);
    
#ifdef __cplusplus
}
#endif

#endif  /* _GETOPT_H_ */
#endif  /* __GNUC__ */

/*** wingetopt.cpp ***/

/*
POSIX getopt for Windows

  AT&T Public License
  
    Code given out at the 1985 UNIFORUM conference in Dallas.  
*/
#include "StdAfx.h"
#include "wingetopt.h"
#include <stdio.h>

#define NULL    0
#define EOF    (-1)
#define ERR(s, c)    if(opterr){
    char errbuf[2];
    errbuf[0] = c; errbuf[1] = '
';
    fputs(argv[0], stderr);
    fputs(s, stderr);
fputc(c, stderr);}
//(void) write(2, argv[0], (unsigned)strlen(argv[0]));
//(void) write(2, s, (unsigned)strlen(s));
//(void) write(2, errbuf, 2);}

int    opterr = 1;
int    optind = 1;
int    optopt;
char    *optarg;

int getopt(int argc, char **argv, char *opts)
{
    static int sp = 1;
    register int c;
    register char *cp;
    
    if(sp == 1)
        if(optind >= argc ||
            argv[optind][0] != '-' || argv[optind][1] == '')
            return(EOF);
        else if(strcmp(argv[optind], "--") == NULL) {
            optind++;
            return(EOF);
        }
        optopt = c = argv[optind][sp];
        if(c == ':' || (cp=strchr(opts, c)) == NULL) {
            ERR(": illegal option -- ", c);
            if(argv[optind][++sp] == '') {
                optind++;
                sp = 1;
            }
            return('?');
        }
        if(*++cp == ':') {
            if(argv[optind][sp+1] != '')
                optarg = &argv[optind++][sp+1];
            else if(++optind >= argc) {
                ERR(": option requires an argument -- ", c);
                sp = 1;
                return('?');
            } else
                optarg = argv[optind++];
            sp = 1;
        } else {
            if(argv[optind][++sp] == '') {
                sp = 1;
                optind++;
            }
            optarg = NULL;
        }
        return(c);
}

以上的wingetopt.h与wingetopt.cpp来自 这里

另外也可以看看codeproject上的一个实现 XGetopt

原文地址:https://www.cnblogs.com/kekec/p/3540874.html