getopt()是libc的标准函数,很多语言中都能找到它的移植版本。
// -b -p "c:input" -o "e: estoutput" bool bBinary = false; char szPath[MAX_PATH] = {0}; char szOput[MAX_PATH] = {0}; int c = 0; while ((c = getopt(argc, argv, "bp:o:")) != -1) { 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[2]; errbuf[0] = c; errbuf[1] = ' '; fputs(argv[0], 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 = 1; int optind = 1; int optopt; char *optarg; int getopt(int argc, char **argv, char *opts) { static int sp = 1; register int c; register char *cp; if(sp == 1) if(optind >= argc || argv[optind][0] != '-' || argv[optind][1] == '