自制getopt函数

本文介绍了如何使用C语言和指针技术解析命令行参数,详细讲解了do_args函数的实现过程,包括识别控制字符和处理加号操作。通过实例演示了如何调用easy_do_arg和easy_illegal_arg函数来处理合法和非法参数。
摘要由CSDN通过智能技术生成

看《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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值