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

// -b -p "c:\input" -o "e:\test\output"

bool bBinary = false;
char szPath[MAX_PATH] = {};
char szOput[MAX_PATH] = {}; int c = ;
while ((c = getopt(argc, argv, "bp:o:")) != -)
{
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[];\
errbuf[] = c; errbuf[] = '\n';\
fputs(argv[], 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 = ;
int optind = ;
int optopt;
char *optarg; int getopt(int argc, char **argv, char *opts)
{
static int sp = ;
register int c;
register char *cp; if(sp == )
if(optind >= argc ||
argv[optind][] != '-' || argv[optind][] == '\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 = ;
}
return('?');
}
if(*++cp == ':') {
if(argv[optind][sp+] != '\0')
optarg = &argv[optind++][sp+];
else if(++optind >= argc) {
ERR(": option requires an argument -- ", c);
sp = ;
return('?');
} else
optarg = argv[optind++];
sp = ;
} else {
if(argv[optind][++sp] == '\0') {
sp = ;
optind++;
}
optarg = NULL;
}
return(c);
}

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

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

使用getopt函数对windows命令行程序进行参数解析的更多相关文章

  1. 用eclipse来运行带参数的命令行程序,配置命令行程序的参数

    以上从网上找了点资料:右键点主类名 --> 运行--> 打开运行对话框--> Main(主类)--> 右边Arguments(参数) 点他以后然后在下面Program argu ...

  2. python如何通过windows命令行运行一个python程序文件?

    python如何通过windows命令行运行一个python程序文件? cmd 进入到py文件对应目录下或者直接在上面的文件地址栏输入cmd,敲入回车 定位到对应的目录下 输入python xxx.p ...

  3. 在 Mac OS X 上创建的 .NET 命令行程序访问数据库 (使用Entity Framework 7 )

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  4. Windows命令行命令集锦

    原文:Windows命令行命令集锦 转自:http://www.me2wg.com/bbs/forum.php?mod=viewthread&tid=15830 winver--------- ...

  5. 在windows命令行窗口下执行:查看所有的端口占用情况

    开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选&qu ...

  6. 探索Windows命令行系列(2):命令行工具入门

    1.理论基础 1.1.命令行的前世今生 1.2.命令执行规则 1.3.使用命令历史 2.使用入门 2.1.启动和关闭命令行 2.2.执行简单的命令 2.3.命令行执行程序使用技巧 3.总结 1.理论基 ...

  7. 探索Windows命令行系列(5):几个实用的命令例解

    1.关机命令(shutdown) 2.管理 Windows 服务(sc) 3.管理任务进程(tasklist.taskkill) 4.显示 TCP/IP 配置值(ipconfig) 5.网络诊断工具( ...

  8. 探索Windows命令行系列(6):活用批处理解决实际问题

    1.批量修改文件名 2.批量重启服务 3.全盘搜索指定文件 3.1.全盘搜索名称为 mm.jpg 的文件,获取其全路径 3.2.查找系统中所有名称以 .docx 结尾的文件 4.调用可执行程序 4.1 ...

  9. 命令行程序增加 GUI 外壳

    Conmajia © 2012 Updated on Feb. 21, 2018 命令行大家都用过: 图 1 命令行程序工作界面 现在想办法为它做一个 GUI 外壳,实际效果参考图 2. 图 2 带 ...

随机推荐

  1. getopt函数的使用——分析命令行参数

    getopt(分析命令行参数) getopt(分析命令行参数) 短参数的定义 返回值 范例 getopt_long 相关函数表头文件#include<unistd.h> 函数声明int g ...

  2. fastx_toolkit去除测序数据中的接头和低质量的reads

    高通量测序数据下机后得到了fastq的raw_data,通常测序公司在将数据返还给客户之前会做"clean"处理,即得到clean_data.然而,这些clean_data是否真的 ...

  3. COGS 2188. [HZOI 2015] Math 题解

      题目描述: 给定n个数X1-Xn,求下面式子的值(整数部分): n<=107,xi<=109且互不相同. 分析: 其实一开始看见这道题我也吓傻了,k这么大,再说我又是数论鶸渣,打死也不 ...

  4. django操作数据库之查询F,Q操作 和 seach搜索功能

    # F 使用查询条件的值 # # from django.db.models import F # models.Tb1.objects.update(num=F('num')+1) # Q 构建搜索 ...

  5. 使用Gitosis搭建Git服务器

    使用Gitosis搭建Git服务器 作者: JeremyWei | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明 网址: http://weizhifeng.net/build- ...

  6. C#之GDI+

    1.使用Brushes填充矩形区域 Graphics g = e.Graphics; g.FillRectangle(Brushes.Green, , , , )); 2.使用LinearGradie ...

  7. Java RuntimeException异常处理汇总

    Java中所有异常的父类是Throwable类,在Throwable类下有两大子类: 一个是Error类,指系统错误异常,例如:VirtualMachineError 虚拟机错误,ThreadDeat ...

  8. ios 单一线程中的Runloop机制会导致线程安全问题吗?

    今天在处理多线程突然想到一个问题,多核处理器会不会导致,单一线程中,由runloop分发的2个函数同时执行呢?进而同时修改同一个变量,产生bug? 我做了以下的测试: - (void)viewDidL ...

  9. ios Swift 一些注意事项

    func test(one:NSString) -> NSString{ return "aaa" } func test(one:Int) -> NSString{ ...

  10. irc操作小记

    IRC客户端 HexChat 跨平台支持,目前正在Windows上使用,暂无不满意的地方 polari 支持的命令太少了,功能有限. Empathy 重量级,支持各种消息协议 weechat/irss ...