使用getopt函数对windows命令行程序进行参数解析
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命令行程序进行参数解析的更多相关文章
- 用eclipse来运行带参数的命令行程序,配置命令行程序的参数
以上从网上找了点资料:右键点主类名 --> 运行--> 打开运行对话框--> Main(主类)--> 右边Arguments(参数) 点他以后然后在下面Program argu ...
- python如何通过windows命令行运行一个python程序文件?
python如何通过windows命令行运行一个python程序文件? cmd 进入到py文件对应目录下或者直接在上面的文件地址栏输入cmd,敲入回车 定位到对应的目录下 输入python xxx.p ...
- 在 Mac OS X 上创建的 .NET 命令行程序访问数据库 (使用Entity Framework 7 )
var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...
- Windows命令行命令集锦
原文:Windows命令行命令集锦 转自:http://www.me2wg.com/bbs/forum.php?mod=viewthread&tid=15830 winver--------- ...
- 在windows命令行窗口下执行:查看所有的端口占用情况
开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选&qu ...
- 探索Windows命令行系列(2):命令行工具入门
1.理论基础 1.1.命令行的前世今生 1.2.命令执行规则 1.3.使用命令历史 2.使用入门 2.1.启动和关闭命令行 2.2.执行简单的命令 2.3.命令行执行程序使用技巧 3.总结 1.理论基 ...
- 探索Windows命令行系列(5):几个实用的命令例解
1.关机命令(shutdown) 2.管理 Windows 服务(sc) 3.管理任务进程(tasklist.taskkill) 4.显示 TCP/IP 配置值(ipconfig) 5.网络诊断工具( ...
- 探索Windows命令行系列(6):活用批处理解决实际问题
1.批量修改文件名 2.批量重启服务 3.全盘搜索指定文件 3.1.全盘搜索名称为 mm.jpg 的文件,获取其全路径 3.2.查找系统中所有名称以 .docx 结尾的文件 4.调用可执行程序 4.1 ...
- 命令行程序增加 GUI 外壳
Conmajia © 2012 Updated on Feb. 21, 2018 命令行大家都用过: 图 1 命令行程序工作界面 现在想办法为它做一个 GUI 外壳,实际效果参考图 2. 图 2 带 ...
随机推荐
- div 加滚动条
div 加滚动条的方法: <div style="position:absolute; height:400px; overflow:auto"></div> ...
- 正在使用广告标识符 (IDFA)
APP提交审核后,apple方面一直说我使用了IDFA,APP里没有集合任何广告SDK. 怀疑是其他第三方的SDK用了. 检测命令 //在项目的根目录下用终端执行 grep -r advertisin ...
- 一致性哈希算法以及其PHP实现
在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法(Round Robin).哈希算法(HASH).最少连接算法(Least Connection).响应速度算法(Respons ...
- Git对象模型
原文:http://gitbook.liuhui998.com/1_2.html 一.SHA 在git中,所有用来表示项目历史信息的文件,是通过一个40个字符的(40-digit)"对象名& ...
- 套接字Socket
TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的.UDP( ...
- 在中文windows下使用pywinauto进行窗口操作
这两天开始接触pywinauto,听说百度的自动化QA也用这个模块,于是来了兴趣,但网上的教程很少,而且基本上都是拿官方的notepad来说,首先中文菜单的支持是问题,其次各种操作也没有写清楚,阅读官 ...
- ios coredata 无任何错误提示crash
最近写程序是遇到了一种情况,对coredata 操作时,有一定几率crash,crash时无任何说明,断点调试后发现,fetch出的对象的属性竟然和数据库中的不同,不知道什么情况下导致了context ...
- java web 学习 --第三天(Java三级考试)
第二天的学习内容这里:http://www.cnblogs.com/tobecrazy/p/3446646.html Jsp中的动作标签 <jsp:include> 实现动态包含,在一个文 ...
- 构建web应用示例
1.1 请求方法的判断 var http = require('http'); var server = http.createServer(function(request,response){ s ...
- 配置tomcat的虚拟路径
配置tomcat的虚拟路径有两个地方需要配置,以eclipse为例: ①在tomcat的server.xml中的host节点内添加 <Context path="/meims/user ...