看《c与指针》第13章最后一题,需要自制处理命令行参数的函数。
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int do_args(int argc, char **argv, char* control, \
void (*do_arg)(int ch,char* value),void (*illegal_arg)(int ch));
int search_in_control(const char* control,int ch){
char* chp = strchr(control,ch);
if(chp){
return chp-control;
}
return -1;
}
void easy_do_arg(int ch,char* value){
printf("do %c in %s way\n",(char)ch,value?value:"default");
}
void easy_illegal_arg(int ch){
printf("%c is not a given command\n",(char)ch);
}
int main(int argc, char **argv){
int put = do_args(argc,argv,"xy+",easy_do_arg,easy_illegal_arg);
printf("%d\n",put);
}
int do_args(int argc, char** argv, char* control, void (*do_arg)(int ch, char* value), void (*illegal_arg)(int ch)) {
for(int i = 0; i != argc; ++i){
printf("%s ",*(argv+i));
}printf("\n");
int my_argc = argc, ctrl_num = 0, ctrl_max_num = strlen(control), plus_flag = 0;
size_t i = 0, j = 0;
char** return_char = argv, ** my_argv = argv;
++i;//skip prog's name
while (j = 0, my_argv[i]!=NULL && my_argv[i][j] == '-') {
while (my_argv[i][++j]!='\0') {
if ((ctrl_num = search_in_control(control, my_argv[i][j])) != -1) {
if (ctrl_num + 1 < ctrl_max_num && control[ctrl_num + 1] == '+') {//with '+'
if (my_argv[i][j+1] != 0) {//rich back
do_arg(my_argv[i][j], &my_argv[i][j+1]);
printf("plus i by line 43\n");
++i;break;
}
else {//poor back
if (my_argv[i+1][0]!=0) {
do_arg(my_argv[i][j], (char*)my_argv[i+1]);
printf("plus i by line 50\n");
i+=2;break;
}
else {
illegal_arg(my_argv[i][j]);
printf("jump from line 52\n");
return ++i;//jump out
}
}
}
else { do_arg(my_argv[i][j], 0); plus_flag = 1; continue; }//not with '+'
}
else {
illegal_arg(my_argv[i][j]);
printf("jump from line 61\n");
return ++i;//jump out
}
}
plus_flag&&(++i,printf("plus i by line 66\n"));
}
return i;
}