こう。 #7602(2008/09/09 07:15 GMT) [ C ] Rating0/0=0.00
いつも使ってる解析ルーチンをベースにしてみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
#include <stdio.h> struct cmd_opt{ int opt_o; int opt_q; int opt_d; int string_start; int string_num; }; int cmdline(int argc,char* argv[],struct cmd_opt*o){ char* p; int i=1; int opt_flag=0; //必ず-oと文字列が必要 if(argc<3) return -1; o->opt_o=0; o->opt_q=0; o->opt_d=-1; o->string_start=0; o->string_num=0; p=argv[1]; while(i<=argc){ switch(*p){ case '-': case '+': case '/': p++; opt_flag=1; break; default: break; } //オプション解析終了 if(opt_flag==0){ if(o->opt_o==0) return -1; if(o->opt_d==-1) return -1; o->string_start=i; o->string_num=argc-i; if(o->string_num==0) return -1; else return 0; } switch(*p){ case 'o': case 'O': o->opt_o=1; break; case 'q': case 'Q': o->opt_q=1; break; case 'd': case 'D': p++;; if(*p==0){ p=argv[++i]; } if('0'>*p||*p>'2') return -1; o->opt_d=*p-'0'; break; default: return -1; break; } p++; if(*p==0){ p=argv[++i]; opt_flag=0; } } return -1; } void put_usage(){ printf("usage:cmdopt -o [-q] -d{0|1|2} 文字列 [文字列 ...]\n"); } int main(int argc,char* argv[]){ int ret; int i; struct cmd_opt o; ret=cmdline(argc,argv,&o); if(ret==-1){ put_usage(); return -1; } printf("[Option Info]\n"); printf("o(output):%s\n",o.opt_o?"ON":"OFF"); printf("q(output):%s\n",o.opt_q?"ON":"OFF"); printf("d(output):%d\n",o.opt_d); printf("\n"); printf("[Parameter Info]\n"); printf("String Num:%d\n",o.string_num); for(i=1;i<=o.string_num;i++){ printf("%d:%s\n",i,argv[i+o.string_start-1]); } return 0; }
Rating0/0=0.00-0+
[ reply ]
こう。 #7602() [ C ] Rating0/0=0.00
Rating0/0=0.00-0+
[ reply ]