【问题标题】:How to make getopt skip the program name and the script name before processing arguments?如何让 getopt 在处理参数之前跳过程序名称和脚本名称?
【发布时间】:2020-07-31 13:21:34
【问题描述】:

我想我正在设法安排事情,以便getopt_long 跳过争论。

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

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

$ 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 开始的。我认为这需要跳过那部分(又名,将这两个术语视为启动程序的名称)

解析代码如下:

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;
        }
    }
}

这是你看到的:

有效

$ my_c_app --buddy moe --buddy larry --buddy curly
my_c_app
--buddy
moe
--buddy
larry
--buddy
curly
--------
moe
larry
curly

失败

interpreter
my_script.scr
--buddy
moe
--buddy
larry
--buddy
curly
--------
(null)
(null)
(null)

注意事项:

  • 我尝试将 optind 设置为不同的值,不。
  • 我的翻译真的是lua。
  • 我不认为这是 lua 的事情。也可以是python my_script.py

【问题讨论】:

    标签: c getopt getopt-long


    【解决方案1】:

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

    void parse_cli(int argc, char *const *argv)
    {
        if (argc > 1 && argv[1][0] != '-') {
            argv++;
            argc--;
        }
        ...
    

    【讨论】:

    • 当我使用optarg 时,这个解决方案给我带来了一些问题。它不再始终等于参数的值。我尝试了argv[optind],它在我启动应用程序的两种方式之间的行为也不一致。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多