可可西

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

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

复制代码
// -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);
    }
}
复制代码

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] = '\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);
}
复制代码

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

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

posted on   可可西  阅读(4644)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)

导航

统计信息

点击右上角即可分享
微信分享提示