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
原创粉丝点击