首页 > Windows开发 > 详细

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

时间:2014-02-09 16:02:46      阅读:588      评论:0      收藏:0      [点我收藏+]

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

bubuko.com,布布扣
// -b -p "c:\input" -o "e:\test\output"

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);
    }
}
bubuko.com,布布扣

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

/*** wingetopt.h ***/

bubuko.com,布布扣
/*
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__ */
bubuko.com,布布扣

/*** wingetopt.cpp ***/

bubuko.com,布布扣
/*
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] = \n;    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] == \0)
            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] == \0) {
                optind++;
                sp = 1;
            }
            return(?);
        }
        if(*++cp == :) {
            if(argv[optind][sp+1] != \0)
                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] == \0) {
                sp = 1;
                optind++;
            }
            optarg = NULL;
        }
        return(c);
}
bubuko.com,布布扣

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

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

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

原文:http://www.cnblogs.com/kekec/p/3540874.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!