使用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 带 ...
随机推荐
- String,StringBuffer,StringBuilder区别
String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...
- Pairing heap
其实挺好写的...(大雾) 理性愉悦大法好... #include<cstdio> #include<algorithm> namespace utils{ template& ...
- 越狱后的ios如何用apt-get 安装各种命令
越狱后的ios如何用apt-get 安装各种命令 iphone越狱后想玩linux. 1. ssh 客户端:ssh Term Pro. 2. 只装客户端是连不上的,还得一个 ssh connect ...
- JAVA分布式事务原理及应用(转)
JTA(Java Transaction API)允许应用程序执行分布式事务处理--在两个或多个网络计算机资源上访问并且更新数据. JDBC驱动程序的JTA支持极大地增强了数据访问能力. 本文的目 ...
- keepalived+haproxy构建高可用负载均衡
一.环境介绍 我用的是centos6.7,内核版本为2.6.32-573.el6.x86_64,keepalived版本为keepalived-1.2.22,haproxy版本为haproxy-1.6 ...
- 【转】mysql的cardinality异常,导致索引不可用
转自:http://ourmysql.com/archives/1343 前段时间,一大早上,就收到报警,警告php-fpm进程的数量超过阈值.最终发现是一条sql没用到索引,导致执行数据库查询慢了, ...
- 利用ssh-copy-id无需密码登录远程服务器
本地机器生成公钥和私钥 ssh-keygen -t rsa 一路回车,最后会在~/.ssh目录下生成id_rsa和id_rsa.pub这两个文件. 与远程服务器建立信任机制 ssh-copy-id - ...
- selenium使用actions.moveToElement处理菜单
//should set firefox path //FirefoxBinary binary=new FirefoxBinary(new File("C:\\Program Files ...
- Win7下同时使用有线和无线时的优先级设置
终于找到这个问题的解决方案了!!!!我是通过方法1改跃点数实现的,方法2无效. http://linshengling.blog.163.com/blog/static/114651912012102 ...
- Java for LeetCode 232 Implement Queue using Stacks
Stack<Integer> stack=new Stack<Integer>(); public void push(int x) { stack.push(x); } // ...