zoukankan      html  css  js  c++  java
  • 使用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

  • 相关阅读:
    Django中查询相关操作
    django Field选项中null和blank的区别
    翻转链表和k个一组翻转以及两两反转
    一道腾讯面试题:如何快速判断某 URL 是否在 20 亿的网址 URL 集合中?
    struct-config.xml配置文件的解析
    taglib标签在web.xml文件中报错的解决办法
    解决html中的乱码问题
    css的学习笔记
    选择器要这么用!!!!66666
    什么是个CDN???CDN是干什么的??
  • 原文地址:https://www.cnblogs.com/kekec/p/3540874.html
Copyright © 2011-2022 走看看