getopt 短选项实现(部分)
来源:互联网 发布:近年淘宝发展历程概述 编辑:程序博客网 时间:2024/06/07 23:04
因为要在stm32上用,所以自己实现了一个简单的。
#include <stdio.h>#include <string.h>#include <stdlib.h>/**获取字符串选项及参数*@Note需连续调用该函数返回-1后才可以重新解析新的字符串,或者置buf=NULL,开始新的解析*@param optarg:返回参数*@param buf:输入字符串选项及参数,eg -d 1 -s abc -t 0 -g*buf=NULL时,结束解析,以便进行新的解析*@param optstring:待处理的选项字符串,如: "ab:cd"*@return解析正确返回支持的选项,解析失败返回-1.解析结束返回0*1. "d:"buf[]="-d" 丢失参数*2."d"buf[]="-dx"选项不匹配,多字符*3."d"buf[]="-x 1"选项不匹配*4."d"buf[]="- d"无选项*5.解析结束*/char getopt(char** optarg, char* buf, const char *optstring){static char *argv[100]={NULL};static unsigned int i=0;//本次搜索结束或者出现错误选项返回,则i=0;可以重新搜索unsigned int k=0;unsigned int j=0; if(buf == NULL){//结束搜索,以便进行新的字符串解析memset(argv,0, 100);i=0;return 0;}//第一次调用该函数分割buf字符串if(i==0){argv[i++] = strtok(buf," ");while((argv[i++] = strtok(NULL," "))!=NULL);i=0;} if(argv[i] == NULL){//搜索结束 i=0; memset(argv,0, 100);return 0;}if((argv[i][k++] == '-') && (argv[i][k] !='\0')){//eg:-d\0for(j=0; optstring[j] != '\0'; j++){if(argv[i][k] == optstring[j]){//match 选项break;}}if((optstring[j]) == '\0'){//no match选项printf("invalid cmd \r\n");i=0;return -1;}if(argv[i][k+1] != '\0'){//无效选项,选项为多字符,eg:-dx\0,printf("invalid cmd \r\n");i=0;return -1;}//以下为有效选项:argv[0][k+1]=='\0'i++;//移到下一字符串if((optstring[j+1]) == ':'){//应有参数*optarg = argv[i];if((*optarg == NULL) || (*optarg)[0] == '-'){//但无参数,eg:-d 后为NULL 或 -d -sprintf("%c: lost argument \r\n", optstring[j]);i=0;return -1;}else{//有参数i++;//移到下一字符串return optstring[j];}}else{//不需要参数*optarg = NULL;return optstring[j];}}i=0;return -1;}#if 0void main(){ char* optarg=NULL; char opt; char buf[128] = "-l qwd -d 1 -q -w 350 -e -s"; while((opt = getopt(&optarg, buf, "d:s:l:qw:e"))!=-1){ printf("%c: %s\n", opt, optarg); } memset(buf, 0, 128); memcpy(buf, "-l qwd -d 1",15 ); while((opt = getopt(&optarg, buf, "d:s:l:qw:e"))!=-1){ printf("%c: %s\n", opt, optarg); }}#endifvoid main(){// char buf[128] = " ads bc d "; int i=0; char*p; char buf[128] = " ads qwd iuy "; printf("start:%s_end\n", buf); for(i=0; i<20; i++){ printf("%d:%c_end\n",i, buf[i]); } p=strtok(buf," "); printf("start:%s_end\n", p); for(i=0; i<20; i++){ printf("%d:%c_end\n",i, buf[i]); } p= strtok(NULL," "); printf("start:%s_end\n", p); for(i=0; i<20; i++){ printf("%d:%c_end\n",i, buf[i]); } printf("===============\n"); char* p1=p; p=strtok(p1," "); printf("start:%s_end\n", p); for(i=0; i<20; i++){ printf("%d:%c_end\n",i, buf[i]); } p=strtok(p," "); printf("start:%s_end\n", p); for(i=0; i<20; i++){ printf("%d:%c_end\n",i, buf[i]); } p=strtok(NULL," "); printf("start:%s_end\n", p); for(i=0; i<20; i++){ printf("%d:%c_end\n",i, buf[i]); }}
csl-B85M-D3V:~/test$ ./test4
l: qwd
d: 1
q: (null)
w: 350
e: (null)
s: lost argument
l: qwd
d: 1
0 0
- getopt 短选项实现(部分)
- Linux选项-getopt/getopt_long
- getopt:命令行选项、参数处理
- getopt解析命令行选项参数
- getopt:命令行选项、参数处理
- 选项解析:getopt() 和 getopt_long()函数
- 命令行程序选项解析函数—getopt
- Linux选项解释-getopt和getopt_long函数
- Linux选项解释-getopt和getopt_long函数
- 使用getopt模块处理命令行选项
- 解析命令行选项参数的 getopt函数
- 命令行程序选项解析函数—getopt
- linux选项解释-getopt和getopt_long函数
- 命令行程序选项解析函数—getopt
- 解析命令行选项参数函数getopt()
- 命令行选项参数解析-getopt函数
- 选项解析函数getopt()和getopt_long()
- 使用getopt模块获取命令行选项
- TMS320F28335学习SPI模块总结笔记
- WebLogic下运行错误java.lang.LinkageError: loader constraint violation in interface itable initialization
- acm 1015 最佳生产方式
- 使用CocoaPods管理依赖库
- 记录我从零入门计算机视觉
- getopt 短选项实现(部分)
- hadoop的Context简单使用
- iOS多线程开发系列之(一)NSThread
- mysql 主从复制 建立新的slave
- SDWebImage使用——一个可管理远程图片加载的类库
- Android数据库 之 开源LitePal
- Android事件传递机制
- p2p年化收益率
- 贝叶斯机器学习