解析命令行参数

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>


int make_argv(const char *astr, const char *delimiters, char ***argvp);

void free_argv(char **argvp);


int main(int argc, char *argv[])
{
    char delim[] = " \t";
    int i;
    char **myargv;
    int numtokens;

    if (argc != 2)
    {
        fprintf(stderr, "Usage: %s string\n",argv[0]);
        return 1;
    }

    if ((numtokens = make_argv(argv[1], delim, &myargv)) == -1)
    {
        fprintf(stderr, "Failed to construct an argument array for %s\n",argv[1]);
        return -1;
    }

    printf("The argument array contains:\n");
    for(i = 0; i < numtokens; ++i)

        printf("%d:%s\n", i, myargv[i]);

    free_argv(myargv);

    return 0;
}

//Name: make_argv
//Description: 利用分割标示符(delimiters)解析命令行参数字符串(astr),并将参数存入参数数组*argvp
int make_argv(const char *astr, const char *delimiters, char ***argvp)
{
    int error;
    int i;
    int numtokens;
    const char *snew;
    char *t, *oldt;

    if ((astr == NULL) || (delimiters == NULL) || (argvp == NULL))
    {
        errno = EINVAL;
        return -1;
    }

    *argvp = NULL;
    snew = astr + strspn(astr, delimiters);    //去除前面的分割标示符
    if ((oldt = t = malloc(strlen(snew) + 1)) == NULL)    //申请空间并保存地址oldt
        return -1;
    strcpy(t, snew);    //初始化待处理命令行
    //求参数个数numtokens,strsep是字符串分割函数
    for(numtokens = 0; strsep(&t, delimiters) != NULL; ++numtokens)
    {
            t = t + strspn(t, delimiters);    //去除前面的分割标示符
    }
    //根据numtokens为*argvp申请空间(参数数组)
    if ((*argvp = malloc((numtokens + 1) * sizeof(char *))) == NULL)
    {
        error = errno;
        free(t);
        errno = error;
        return -1;
    }
    
    if (numtokens == 0)
        free(t);
    else
    {
        t = oldt;
        strcpy(t, snew);    //初始化待处理命令行
    //将解析的参数,存入参数数组*argvp中
        for(i = 0; i < numtokens; ++i)
        {
            *(*argvp + i) = strsep(&t, delimiters);
            if(t)
                t = t + strspn(t, delimiters);    //去除前面的分割标示符
        }
    }

    *(*argvp + numtokens) = NULL;
    return numtokens;
    

}

void free_argv(char **argvp)
{
    if (argvp == NULL)
        return;
    if (*argvp != NULL)
        free(*argvp);
    free(argvp);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中解析命令行参数可以使用标准库中的argparse模块。argparse模块提供了一种简单而灵活的方式来解析命令行参数,并为你创建帮助和用法消息。 下面是一个简单的示例,演示了如何使用argparse模块解析命令行参数: ```python import argparse # 创建一个ArgumentParser对象 parser = argparse.ArgumentParser(description='解析命令行参数示例') # 添加命令行参数 parser.add_argument('input', help='输入文件路径') parser.add_argument('output', help='输出文件路径') parser.add_argument('-v', '--verbose', action='store_true', help='显示详细信息') # 解析命令行参数 args = parser.parse_args() # 访问解析后的参数值 print('输入文件路径:', args.input) print('输出文件路径:', args.output) print('显示详细信息:', args.verbose) ``` 在上面的示例中,我们通过创建一个ArgumentParser对象来定义我们期望的命令行参数。然后,我们使用`add_argument()`方法添加了三个参数:`input`、`output`和`--verbose`。`input`和`output`是必需的位置参数,而`--verbose`是一个可选的开关。 最后,我们使用`parse_args()`方法解析命令行参数,并通过访问`args`对象来获取解析后的参数值。 要运行上述示例,可以在命令行中执行以下命令: ``` python script.py input.txt output.txt --verbose ``` 这将解析命令行参数,并输出相应的值。 希望这可以帮助到你!如果有更多问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值