getopt_long 命令参数解析函数欣赏

来源:互联网 发布:sg wanna be 知乎 编辑:程序博客网 时间:2024/05/16 19:37

getopt_long 命令参数解析函数欣赏

函数

原型

#include <getopt.h>

int getopt_long(int  argc, char * const  argv[],  const char *optstring, const struct option *longopts, int *longindex);

输入

参数

int argc: 输入参数个数,包括可执行项

char * const argv[]:输入参数字符串指针数组,没个元素对应各个参数

const char *optstring:指向短参数常量的指针(参看例子)

h,单字符,只表示一个选项

v:r:b:,单字符后接冒号,表示必须跟参数,且紧跟字符后或用空格隔开,   该参数指针赋值给optarg

const struct option *longopts:指向结构体长参数常量的指针(参看例子)

struct option{

 const char *name;  //长参数名

 int has_arg; //有三类参数,如下所示

 int *flag;  //NULL,返回长参数对对应短参数名

 int val; // getopt_long返回值(实际与flag综合决定)

};

no_argument(或者是0),表示该参数后面不跟参数值

required_argument(或者是1),表示该参数后面一定要跟个参数值

optional_argument(或者是2),表示该参数后面可以跟,也可以不跟参数值

int *longindex:通常为NULL

输出

参数

参数全部解析完成,返回-1

 

应用实例

下面是本人在DM6446项目中使用的代码,供大家学习.


/* ============================================================================ Name        : getopt_long.c Author      : sinonon Version     : v0.0 Copyright   : Your copyright notice Description : getopt_long in C, Ansi-style ============================================================================ */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <getopt.h> #define __DEBUG/* Enables or disables debug output */#ifdef __DEBUG#define DBG(fmt, args...) fprintf(stderr, "XJTU_Encode: " fmt, ## args)#else#define DBG(fmt, args...)#endif#define ERR(fmt, args...) fprintf(stderr, "XJTU_EncodeError: " fmt, ## args) static void usage(void){    fprintf(stderr, "Usage: encode [options]\n\n"      "Options:\n"      "-v | --videofile   Video file to record to\n"      "-r | --resolution  Video resolution ('width'x'height') [720x576]\n"      "-b | --bitrate     Bit rate to encode video at [variable]\n"      "-t | --time        Number of seconds to run the demo [infinite]\n"      "-h | --help        Print this message\n\n"      "You must supply  a video file or\n"      "with appropriate extensions for the file formats.\n\n");} /****************************************************************************** * parseArgs ******************************************************************************/static void parseArgs(int argc, char *argv[]){const char shortOptions[] = "v:r:b:t:h";const struct option longOptions[]={{"videofile", required_argument, NULL, 'v'},{"resolution", required_argument, NULL, 'r'},{"videobitrate", required_argument, NULL, 'b'},{"time", required_argument, NULL, 't'},{"help", no_argument, NULL, 'h'},{0, 0, 0, 0}};    int     c;    char   *extension;    int     imageWidth;    int     imageHeight;    for (;;) {if(argc<2) {ERR("Input parameters error!\n"); break;}        c = getopt_long(argc, argv, shortOptions, longOptions,NULL);         if (c == -1) {break;}        switch (c) {            case 0:                break;                        case 'v':                extension = rindex(optarg, '.');                if (extension == NULL) {                    DBG("Video file without extension: %s\n", optarg);                    exit(EXIT_FAILURE);                }                if (strcmp(extension, ".264") == 0) {                    DBG("Init menu videoEncoder=H264_VIDEO_ENCODER\n ");                }                else if (strcmp(extension, ".mpeg4") == 0) {    DBG("Init menu videoEncoder=MPEG4_VIDEO_ENCODER\n ");                }                else {                    ERR("Unknown video file extension: %s\n",extension);                    exit(EXIT_FAILURE);                }                break;                        case 'r':                if (sscanf(optarg, "%dx%d", &imageWidth,&imageHeight) != 2) {                    ERR("Invalid resolution supplied (%s)\n",optarg);                    usage();                    exit(EXIT_FAILURE);                }DBG("Video resolution : %d x %d\n", imageWidth, imageHeight);                break;             case 'b':                DBG("videoBitRate: %d.\n",atoi(optarg));                break;            case 't':                DBG("time: %d.\n",atoi(optarg));                break;            case 'h':                usage();                exit(EXIT_SUCCESS);            default:                usage();                exit(EXIT_FAILURE);        }    }} int main(int argc, char *argv[]){   parseArgs(argc,argv);   return 0;}

代码测试

 




0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 政府单位领导给我调岗我该怎么办 领导在单位想捞钱我该怎么办 单位领导是宵小之人我该怎么办 一件事想不明白非得想明白怎么办 在四楼上课时发生地震该怎么办 媳妇要离婚我想要孩子该怎么办 媳妇带了避孕环我想要孩子怎么办 新开的文具店一点生意都没有怎么办 孩子在学校被坏孩子欺负了该怎么办 老师像个傻叉我妈还喷我我怎么办啊 承台上预埋桥墩连接钢筋错了怎么办 冲床油缸螺栓拆不下来怎么办 汇款到账银行写错了怎么办 搜狗输入法数字序号超过20怎么办 苹果手机保存的图片变模糊怎么办 微信视频保存到手机变模糊怎么办 自己的位置被别人取代了怎么办 给工厂做半成品老板跑了怎么办 微信变成英文再恢复汉字怎么办 cad中标注尺寸数字太小怎么办 扣扣的钱包手势密码忘记了怎么办 台式电脑带符号的数字打不出怎么办 情侣之间出现看见对方就烦怎么办 电信卡号和联通卡号怎么办情侣号 电脑能登qq但打不开网页怎么办 想跟朋友聊天但对方不理怎么办 刚进婆家门被婆婆欺负怎么办 支付宝的聊天记录被删了怎么办 彩票站买彩票把钱付了没出票怎么办 与异性朋友聊天没话题了怎么办 快递写错地址但已经发货了怎么办 快递写错电话但已经发货了怎么办 微信添加好友功能被限制怎么办 qq号被冻结了限制解封怎么办 被别人强制拉入qq群怎么办 qq群里的图片过期了怎么办 q附近人不能关注不能发信息怎么办 qq畅聊之火掉了怎么办 打印机打印时上面空白留太多怎么办 发短信一直空格里面写0怎么办 网贷获取我新手机号通讯录怎么办