首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使getopt在处理参数之前跳过程序名和脚本名?

如何使getopt在处理参数之前跳过程序名和脚本名?
EN

Stack Overflow用户
提问于 2020-07-31 13:21:34
回答 1查看 180关注 0票数 0

我想我正在设法安排一些事情,这样getopt_long就跳过了一个论点。

我编写了一个共享库/ dll,并使用它来自C或lua脚本。解析CLI的代码位在共享库/ dll中,它在C中(见下文),我可以从C中的共享库/ dll文件中访问argc和argv。

当我启动我的程序时,它可以是:

代码语言:javascript
复制
$ my_c_app --buddy moe --buddy larry --buddy curly

$ interpreter my_script.scr --buddy moe --buddy larry --buddy curly

当我从my_c_app进行解析时,一切都很好。但是当我从lua脚本中传入argc和argv时,事情就出了问题。

我认为它被绊倒了,因为这一切都是从lua my_script.lua开始的。我认为这需要跳过这一部分(即,将这两个术语作为启动程序的名称)。

下面是解析代码:

代码语言:javascript
复制
static struct option long_options[] = {
    {"buddy", required_argument, NULL, 'b'},
    {"version", optional_argument, NULL, 'v'},
    {NULL, 0, NULL, 0}
};

void parse_cli(int argc, char *const *argv)
{
    char ch;

    // show me what you see
    for (int i = 0; i < argc; i++) {
        printf("%s\n", argv[i]);
    }

    print("--------\n");

    while ((ch = getopt_long(argc, argv, "p:v:", long_options, NULL)) != -1) {
        switch (ch) {
        case 'b':
            printf("buddy %s\n", optarg);
            break;
        case 'v':
            printf("version 1.0\n");
        default:
            break;
        }
    }
}

你看到的是:

works

代码语言:javascript
复制
$ my_c_app --buddy moe --buddy larry --buddy curly
my_c_app
--buddy
moe
--buddy
larry
--buddy
curly
--------
moe
larry
curly

失败

代码语言:javascript
复制
interpreter
my_script.scr
--buddy
moe
--buddy
larry
--buddy
curly
--------
(null)
(null)
(null)

备注:

  • 我尝试将optind设置为不同的值,不,
  • ,我的解释器实际上是lua,
  • ,我不认为这是lua的东西。也可以是python my_script.py
EN

回答 1

Stack Overflow用户

发布于 2020-07-31 13:39:22

您可以做的一个快速修复方法是检查argv[1]是否存在,并且不以-开头。如果是的话,从argv + 1开始解析。

代码语言:javascript
复制
void parse_cli(int argc, char *const *argv)
{
    if (argc > 1 && argv[1][0] != '-') {
        argv++;
        argc--;
    }
    ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63192684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档