解析命令行參數(shù),全部存入list當(dāng)中,然后提供函數(shù)讀取參數(shù);
upsoft_arg_parser.h
#ifndef _ARGVS_PARSE_H_
#define _ARGVS_PARSE_H_
//
// 應(yīng)用參數(shù)解析類CArgNodeList
// 創(chuàng)建: 2010-06-05 changym, changup@qq.com
// 修改:
//
//////////////////////////////////////////////////////////////////////
#include <list>
///////////////////////////////////////////////////////
// 參數(shù)是否有指示符-字典定義
///////////////////////////////////////////////////////
typedef enum enumHasSymbol {hsNone/*沒有*/,hsOnly,hsHasValue};
typedef struct tagArgNode
{
tagArgNode(enumHasSymbol hassymbol,const char* pszsymbol,const char* pszvalue)
{
m_pszsymbol = m_pszvalue = 0;
m_hassymbol = hassymbol;
if(pszsymbol)
{
m_pszsymbol = new char[strlen(pszsymbol)+1];
strcpy(m_pszsymbol,pszsymbol);
m_pszsymbol[strlen(pszsymbol)] = '\0';
}
if(pszvalue)
{
m_pszvalue = new char[strlen(pszvalue)+1];
strcpy(m_pszvalue,pszvalue);
m_pszvalue[strlen(pszvalue)] = '\0';
}
}
~tagArgNode()
{
if(m_pszsymbol)
{
delete [] m_pszsymbol;
m_pszsymbol = NULL;
}
if(m_pszvalue)
{
delete [] m_pszvalue;
m_pszvalue = NULL;
}
}
enumHasSymbol m_hassymbol;
char* m_pszsymbol; //指示符串,不光是單個(gè)字符而且也可以是一個(gè)單詞
char* m_pszvalue; //指示符值串,當(dāng)hassymbol in (hsNone,hsHasValue)
//的時(shí)候有效
}ARGNODE,*PARGNODE;
//////////////////////////////////////////////
// 所有參數(shù)的集合
//
//////////////////////////////////////////////
class CArgNodeList : public list<PARGNODE>
{
public:
~CArgNodeList()
{
PARGNODE pnode = NULL;
while(!empty())
{
pnode = front();
delete pnode;
pop_front();
}
clear();
}
public:
int parser(int argc,char* argv[])
{
PARGNODE pnode = NULL;
for(int i=0;i<argc;i++)
{
char c = argv[i][0];
if(c=='-') //-符號(hào)發(fā)現(xiàn)
{
if(!argv[i][1])
{
//printf("-發(fā)現(xiàn),非法,跳過\n");
continue;
}
if(argv[i+1]) //后續(xù)有參數(shù)
{
if(argv[i+1][0]=='-') //后續(xù)是一個(gè)新的參數(shù)
{
//printf("發(fā)現(xiàn)僅有指示符的參數(shù):%s\n",argv[i]+1);
pnode = append(hsOnly,argv[i]+1,NULL);
}
else //后續(xù)是當(dāng)前參數(shù)的值
{
//printf("發(fā)現(xiàn)有指示符而且?guī)?shù)值的參數(shù):%s-%s\n",argv[i]+1,argv[i+1]);
pnode = append(hsHasValue,argv[i]+1,argv[i+1]);
i++;
}
}
else //后續(xù)沒有了參數(shù),那當(dāng)前參數(shù)就是-h之類的東西
{
//printf("發(fā)現(xiàn)僅有指示符的參數(shù):%s\n",argv[i]+1);
pnode = append(hsOnly,argv[i]+1,NULL);
}
}
else
{
//printf("發(fā)現(xiàn)光禿禿的參數(shù):%s\n",argv[i]);
pnode = append(hsNone,NULL,argv[i]);
}
}
return 1;
}
public:
//根據(jù)符號(hào)查找節(jié)點(diǎn),用于查找 -a option || -a 這樣的參數(shù)節(jié)點(diǎn)
PARGNODE getnode_symbol(const char* pszsymbol)
{
iterator iter = begin();
while(iter!=end())
{
if((*iter)->m_hassymbol!=hsNone) //有符號(hào)
{
if(!strcmp((*iter)->m_pszsymbol,pszsymbol))
{
return *iter;
}
}
iter++;
}
return NULL;
}
PARGNODE append(enumHasSymbol hassymbol,const char* pszsymbol,const char* pszvalue)
{
PARGNODE pnode = new ARGNODE(hassymbol,pszsymbol,pszvalue);
push_back(pnode);
return pnode;
}
//值完全匹配查找節(jié)點(diǎn),用于查找 option 這樣的節(jié)點(diǎn)用
PARGNODE getnode_value(const char* pszvalue);
//根據(jù)值的前n位查找節(jié)點(diǎn),用于查找 name=value這樣的節(jié)點(diǎn)
PARGNODE getnode_n_value(const char* pszvalue);
public:
void print()
{
printf("++++++++++++開始打印各參數(shù)節(jié)點(diǎn)信息++++++++++++++\n");
int i=1;
iterator iter = begin();
while(iter != end())
{
printf("第%d個(gè)參數(shù)節(jié)點(diǎn):\n\t是否有指示符=%s\n\t指示符=%s\n\t值=%s\n",
i++,
(*iter)->m_hassymbol==hsNone?"無":((*iter)->m_hassymbol==hsOnly?"僅僅":"含值"),
(*iter)->m_pszsymbol?(*iter)->m_pszsymbol:"NULL",
(*iter)->m_pszvalue?(*iter)->m_pszvalue:"NULL");
iter++;
}
}
private:
};
#endif //_ARGVS_PARSE_H_
測試程序:upsoft_arg_parser_test.cpp
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
#include "upsoft_arg_parser.h"
int main(int argc, char* argv[])
{
printf("++++++++++++++++++changup解析測試++++++++++++++++\n");
//////////////////////////////////////////////////////////////
// 可能出現(xiàn)的參數(shù)形式:
// a 沒有-指示
// -a 只有指示符
// -a changjr 有指示符而且指示出了值
// - 非法的-
// -a changjr=erzi 自定義的參數(shù)值
// changjr=er 直接是參數(shù)值
//////////////////////////////////////////////////////////////
// 具體的應(yīng)用應(yīng)該交給應(yīng)用層自己去運(yùn)用客戶傳入的參數(shù)和參數(shù)規(guī)則
//+合法性檢查.
//////////////////////////////////////////////////////////////
CArgNodeList argnodelist;
argnodelist.parser(argc,argv);
argnodelist.print();
return 0;
}