我有一个函数来检查我的程序的参数。
我想得到给定用户argument
的long-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;
}
2条答案
按热度按时间41ik7eoe1#
查看
getopt_long()
的文档和源代码,如果它解析短选项,似乎不会计算长选项的索引,因此您在option_index
中看到未初始化的数据。只有当实际存在长期权时,它才会填充数据。
如果你需要这个值,编写你自己的循环来遍历数组,寻找返回的short选项。
这里是从BSD复制到Android中的
getopt_long()
的链接。我认为这在其他平台上都是一样的。https://android.googlesource.com/platform/bionic/+/a27d2baa/libc/unistd/getopt_long.c
lx0bsm1f2#
好吧,你必须区分
short
和long
选项。如果使用需要参数的选项,则必须添加一个参数才能获得结果。如果您忘记添加
--output-dir
的路径,请在此处添加带参数if工作正常: