c++ Cpp:如何使用getopt. h获取选项的长名称

vvppvyoh  于 2023-06-07  发布在  其他
关注(0)|答案(2)|浏览(178)

我有一个函数来检查我的程序的参数。
我想得到给定用户argumentlong-name。问题是目前他给了我奇怪的高数字的例子32758,而我的结构只有9个元素…
我必须用它上大学,否则我会用升压库。

#include <iostream>
#include <getopt.h>

int main(int argc, char *argv[])
{
    // Standard directories
    std::string outputDir = "PROJECT_PATH\\output\\"; /**< Output directory */

    // Options
    const struct option longOptions[3] = {
        {"output-dir", required_argument, nullptr, 'O'},
        {"help", no_argument, nullptr, 'h'},
        {nullptr, 0, nullptr, 0}};

    int opt;
    int option_index;
    while ((opt = getopt_long(argc, argv, "O:h", longOptions, &option_index)) != -1)
    {
        std::cout << "Long option index: " << option_index << std::endl;
        std::cout << "Option name: " << longOptions[option_index].name << std::endl;
        switch (opt)
        {
        case 'O':
            outputDir = optarg;
            break;
        case 'h':
            // printHelpText();
            exit(0);
        case '?':
            if ((optopt == 'O' || optopt == 'h'))
            {
                std::cout << "OK ... option '-" << static_cast<char>(optopt) << "' without argument"
                          << std::endl;
                exit(1);
            }
            else if (isprint(optopt))
            {
                std::cerr << "ERR ... Unknown option -" << static_cast<char>(optopt) << std::endl;
                exit(-1);
            }
            else
            {
                std::cerr << "ERR ... Unknown option character \\x" << static_cast<char>(optopt) << std::endl;
                exit(-1);
            }
        }
    }
    return 0;
}
41ik7eoe

41ik7eoe1#

查看getopt_long()的文档和源代码,如果它解析短选项,似乎不会计算长选项的索引,因此您在option_index中看到未初始化的数据。
只有当实际存在长期权时,它才会填充数据。
如果你需要这个值,编写你自己的循环来遍历数组,寻找返回的short选项。
这里是从BSD复制到Android中的getopt_long()的链接。我认为这在其他平台上都是一样的。
https://android.googlesource.com/platform/bionic/+/a27d2baa/libc/unistd/getopt_long.c

lx0bsm1f

lx0bsm1f2#

好吧,你必须区分shortlong选项。如果使用需要参数的选项,则必须添加一个参数才能获得结果。

std::cout << "Long option index: " << option_index << std::endl;
if (option_index > options_amount - 1)
{
    std::cout << static_cast<char>(optopt) << std::endl;
}
else
{
    std::cout << "Option name: " << longOptions[option_index].name << std::endl;
}

如果您忘记添加--output-dir的路径,请在此处添加

mini.exe --output-dir
option requires an argument -- output-dir
Long option index: 32758
O
OK ... option '-O' without argument

带参数if工作正常:

mini.exe --output-dir ./hello
Long option index: 0   
Option name: output-dir

相关问题