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. 2016年10月10日--穷举、迭代、while循环

    穷举 将所有可能性全部全部走一遍,使用IF筛选出满足的情况 练习: 1.单位给发了一张150元购物卡, 拿着到超市买三类洗化用品. 洗发水15元,香皂2元,牙刷5元. 求刚好花完150元,有多少种买法 ...

  2. java去除字符串中的空格、回车、换行符、制表符

    import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author chzeze * 2016-11-07 */ ...

  3. 1.2---翻转字符串(CC150)

    import java.util.*; public class Reverse { public String reverseString(String iniString) { // write ...

  4. 数论v2

    #include <cmath> #include <cstdio> #include <cstring> #include <algorithm> # ...

  5. sublime配置markdown

    1.安装sublime 2.安装package control 3.ctrl+shift+P输入install进入Install Packages 4.安装markdown preview 5.配置删 ...

  6. js里面的 InttoStr 和 StrtoInt

    javascript 字符串 和 数字的转换,话说好灵活,感觉回不去pascal了 int转换string: 1,var str=String(int); 2,num.toString(param) ...

  7. perl运行其他程序的5种方法

    1.使用system函数 运行成功,返回0,运行失败则返回非负整数 system("cmd"); 2.使用qx my $cmd1=qx/date/; 3.使用`` 与qx等效 4. ...

  8. MPlayer-2016-bin-noConsole

    运行 Install-RMenu.cmd 添加右键播放功能 ; 往前0.05秒 大概10多个帧 ' 往后0.05秒 大概10多个帧 鼠标右键 快速定位 鼠标中键 退出 F1 缩小 F2 原始大小 F3 ...

  9. WIZnet官方网盘

    之前使用过 WIZnet 的TCP/IP 解决方案,资源较少, 偶然发现此网盘,不敢独享,访问 请戳此处.

  10. linux下QT Creator常见错误及解决办法

    最近因为在做一个关于linux下计算机取证的小项目,需要写一个图形界面,所以想到了用QT来写,选用了linux下的集成开发环境QT Creator5.5.1,但刚刚安装好,竟然连一个"hel ...