使用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 带 ...
随机推荐
- html5跨域通讯之postMessage的用法
转自:http://www.cnblogs.com/wshiqtb/p/3171199.html postMessagePortal.html 页面代码 <!DOCTYPE html> & ...
- BZOJ 3832: [Poi2014]Rally
Sol 线段树+拓扑序. 先把图的拓扑序搞出来,然后统计从起点到该点最长链,从该点到终点的最长链,然后建个起点终点,这里跟网络流很像,把它统一到一个有起点的图中,这里也要注意下细节处理.S,T的一个边 ...
- linux下git安装
Download for Linux and Unix It is easiest to install Git on Linux using the preferred package manage ...
- Docker个人学习总结
最近一段时间学习了下Docker,关于Docker的安装,运用什么的在这里我不会过多的说明,我只说我对于Docker的一些理解,附加我用于记录的少量代码. 刚开始学习Docker的时候,找资料在网上看 ...
- C#中堆和栈的区别分析
线程堆栈:简称栈 Stack托管堆: 简称堆 Heap 使用.Net框架开发程序的时候,我们无需关心内存分配问题,因为有GC这个大管家给我们料理一切.如果我们写出如下两段代码: 1 代码段1: 2 3 ...
- Install OE and BitBake
LeapFrog Explorers: Install OE and BitBake - eLinux.org http://elinux.org/LeapFrog_Explorers:_In ...
- NGUI 滑动页(UIToggle和UIToggledObjects)
1.NGUI->Create->Scroll View 2.给Scroll View添加一个 UIGrid,自己设置Arragement(横向竖向) 3.给Grid添加元素 4.给元素添加 ...
- 3.nodejs权威指南--文件
1. 文件 1.1 读写整个文件 1.1.1 读 var fs = require('fs'); fs.readFile('./test.txt',function(err,data){ if(err ...
- ABAP 自建透明表维护
*&---------------------------------------------------------------------* *& Report ZMMR011 ...
- AUTOSSH,ssh反向代理
在本地机器 1)ssh-keygen 2)ls ~/.ssh/ 应该有三个文件 id_rsa id_rsa.pub known_hosts 拷贝id_rsa.pub到远程服务器,然后在 ...