zoukankan      html  css  js  c++  java
  • window下getopt函数使用

    # getopt.h是GNU标准库中头文件,主要功能提取命令行参数用于基于文本的C/C++程序。

    # 工作目的:由于getopt.h并不为ANSIC标准库的一部分,在利用VS2015编程过程中需要使用其头文件。

     查阅相关资料,整理如下:

    # 拷贝头文件getopt.h

    /*****************************************************************************
     *
     *  MODULE NAME : GETOPT.C
     *
     *  COPYRIGHTS:
     *             This module contains code made available by IBM
     *             Corporation on an AS IS basis.  Any one receiving the
     *             module is considered to be licensed under IBM copyrights
     *             to use the IBM-provided source code in any way he or she
     *             deems fit, including copying it, compiling it, modifying
     *             it, and redistributing it, with or without
     *             modifications.  No license under any IBM patents or
     *             patent applications is to be implied from this copyright
     *             license.
     *
     *             A user of the module should understand that IBM cannot
     *             provide technical support for the module and will not be
     *             responsible for any consequences of use of the program.
     *
     *             Any notices, including this one, are not to be removed
     *             from the module without the prior written consent of
     *             IBM.
     *
     *  AUTHOR:   Original author:
     *                 G. R. Blair (BOBBLAIR at AUSVM1)
     *                 Internet: bobblair@bobblair.austin.ibm.com
     *
     *            Extensively revised by:
     *                 John Q. Walker II, Ph.D. (JOHHQ at RALVM6)
     *                 Internet: johnq@ralvm6.vnet.ibm.com
     *
     *****************************************************************************/
    
    /******************************************************************************
     * getopt()
     *
     * The getopt() function is a command line parser.  It returns the next
     * option character in argv that matches an option character in opstring.
     *
     * The argv argument points to an array of argc+1 elements containing argc
     * pointers to character strings followed by a null pointer.
     *
     * The opstring argument points to a string of option characters; if an
     * option character is followed by a colon, the option is expected to have
     * an argument that may or may not be separated from it by white space.
     * The external variable optarg is set to point to the start of the option
     * argument on return from getopt().
     *
     * The getopt() function places in optind the argv index of the next argument
     * to be processed.  The system initializes the external variable optind to
     * 1 before the first call to getopt().
     *
     * When all options have been processed (that is, up to the first nonoption
     * argument), getopt() returns EOF.  The special option "--" may be used to
     * delimit the end of the options; EOF will be returned, and "--" will be
     * skipped.
     *
     * The getopt() function returns a question mark (?) when it encounters an
     * option character not included in opstring.  This error message can be
     * disabled by setting opterr to zero.  Otherwise, it returns the option
     * character that was detected.
     *
     * If the special option "--" is detected, or all options have been
     * processed, EOF is returned.
     *
     * Options are marked by either a minus sign (-) or a slash (/).
     *
     * No errors are defined.
     *****************************************************************************/
    
    #include <stdio.h>                  /* for EOF */
    #include <string.h>                 /* for strchr() */
    
    
    /* static (global) variables that are specified as exported by getopt() */
    char *optarg = NULL;    /* pointer to the start of the option argument  */
    int   optind = 1;       /* number of the next argv[] to be evaluated    */
    int   opterr = 1;       /* non-zero if a question mark should be returned
                               when a non-valid option character is detected */
    
    /* handle possible future character set concerns by putting this in a macro */
    #define _next_char(string)  (char)(*(string+1))
    
    int getopt(int argc, char *argv[], char *opstring)
    {
        static char *pIndexPosition = NULL; /* place inside current argv string */
        char *pArgString = NULL;        /* where to start from next */
        char *pOptString;               /* the string in our program */
    
    
        if (pIndexPosition != NULL) {
            /* we last left off inside an argv string */
            if (*(++pIndexPosition)) {
                /* there is more to come in the most recent argv */
                pArgString = pIndexPosition;
            }
        }
    
        if (pArgString == NULL) {
            /* we didn't leave off in the middle of an argv string */
            if (optind >= argc) {
                /* more command-line arguments than the argument count */
                pIndexPosition = NULL;  /* not in the middle of anything */
                return EOF;             /* used up all command-line arguments */
            }
    
            /*---------------------------------------------------------------------
             * If the next argv[] is not an option, there can be no more options.
             *-------------------------------------------------------------------*/
            pArgString = argv[optind++]; /* set this to the next argument ptr */
    
            if (('/' != *pArgString) && /* doesn't start with a slash or a dash? */
                ('-' != *pArgString)) {
                --optind;               /* point to current arg once we're done */
                optarg = NULL;          /* no argument follows the option */
                pIndexPosition = NULL;  /* not in the middle of anything */
                return EOF;             /* used up all the command-line flags */
            }
    
            /* check for special end-of-flags markers */
            if ((strcmp(pArgString, "-") == 0) ||
                (strcmp(pArgString, "--") == 0)) {
                optarg = NULL;          /* no argument follows the option */
                pIndexPosition = NULL;  /* not in the middle of anything */
                return EOF;             /* encountered the special flag */
            }
    
            pArgString++;               /* look past the / or - */
        }
    
        if (':' == *pArgString) {       /* is it a colon? */
            /*---------------------------------------------------------------------
             * Rare case: if opterr is non-zero, return a question mark;
             * otherwise, just return the colon we're on.
             *-------------------------------------------------------------------*/
            return (opterr ? (int)'?' : (int)':');
        }
        else if ((pOptString = strchr(opstring, *pArgString)) == 0) {
            /*---------------------------------------------------------------------
             * The letter on the command-line wasn't any good.
             *-------------------------------------------------------------------*/
            optarg = NULL;              /* no argument follows the option */
            pIndexPosition = NULL;      /* not in the middle of anything */
            return (opterr ? (int)'?' : (int)*pArgString);
        }
        else {
            /*---------------------------------------------------------------------
             * The letter on the command-line matches one we expect to see
             *-------------------------------------------------------------------*/
            if (':' == _next_char(pOptString)) { /* is the next letter a colon? */
                /* It is a colon.  Look for an argument string. */
                if ('' != _next_char(pArgString)) {  /* argument in this argv? */
                    optarg = &pArgString[1];   /* Yes, it is */
                }
                else {
                    /*-------------------------------------------------------------
                     * The argument string must be in the next argv.
                     * But, what if there is none (bad input from the user)?
                     * In that case, return the letter, and optarg as NULL.
                     *-----------------------------------------------------------*/
                    if (optind < argc)
                        optarg = argv[optind++];
                    else {
                        optarg = NULL;
                        return (opterr ? (int)'?' : (int)*pArgString);
                    }
                }
                pIndexPosition = NULL;  /* not in the middle of anything */
            }
            else {
                /* it's not a colon, so just return the letter */
                optarg = NULL;          /* no argument follows the option */
                pIndexPosition = pArgString;    /* point to the letter we're on */
            }
            return (int)*pArgString;    /* return the letter that matched */
        }
    }
    View Code

      拷贝后的头文件放入工程目录下,并在主程序中包含 #include "getopt.h"。

      另:拷贝相关头文件及其库函数可参考博客

    #getopt函数介绍:

      (1)函数定义

    int getopt(int argc, char *argv[], char *opstring)

      (2)短参数定义

    • 不带值的参数,定义本身即是参数。
    • 必带值的参数,定义在参数后加冒号:。
    • 可选值的参数,定义在参数后加两个冒号::。

     (3) 参数介绍

    • argc 接收main( )传递参数个数
    • argv 接收main( )传递参数内容
    • optstring 欲处理选项字符串作为短参数列表。

    #用例说明:

      主要内容参考博客链接

    若oprstring收集短参数列表表示为"acd:e::"

    ac表示不带参数,其本身即为参数。d必须定义参数,e可定义参数。

    调用过程中,'-a -c -d dup -e','-a -c -d up -eeup','-ac -d dup -eeup'均为合法调用。

    • 不带值的参数,可以连写或分开写。例如'-a -c'或'-ac'或'-ca'。
    • 参数不区分先后顺序。
    • 重点注意,可选值的参数值与参数之间不允许有空格,必须连写。例如'-eeup'

    #返回值说明

    • getopt( ) 逐次调用命令行参数。
    • 直至所有参数遍历一遍,传入空参数getopt( )返回-1。
    • 若发生不在optstring( )里面的参数,或必选值参数不带值时,返回"-1"。

    #更为详细说明参考博客

    1. https://www.cnblogs.com/qingergege/p/5914218.html
    2. http://blog.51cto.com/vopit/440453
    3. https://www.cnblogs.com/oloroso/p/4856104.html

    #windows窗口下调用

      按照如上规则,编译后调用命令行窗口调用即可例如:

    test.exe -ac -d dup -eeup
  • 相关阅读:
    说说ReactiveCocoa 2
    xcode5 添加Build Phases脚本
    关于CoreData的一个工具Mogenerator的使用
    Keystone controller.py & routers.py代码解析
    Openstack Restful API 开发框架 Paste + PasteDeploy + Routes + WebOb
    Openstack Restful API 开发框架 Paste + PasteDeploy + Routes + WebOb
    Web 开发规范 — WSGI
    Web 开发规范 — WSGI
    Openstack API 类型 & REST 风格
    Openstack API 类型 & REST 风格
  • 原文地址:https://www.cnblogs.com/SKY-ZL/p/8395677.html
Copyright © 2011-2022 走看看