我想我正在设法安排一些事情,这样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;
}
}
}你看到的是:
works
$ 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设置为不同的值,不,python my_script.py发布于 2020-07-31 13:39:22
您可以做的一个快速修复方法是检查argv[1]是否存在,并且不以-开头。如果是的话,从argv + 1开始解析。
void parse_cli(int argc, char *const *argv)
{
if (argc > 1 && argv[1][0] != '-') {
argv++;
argc--;
}
...https://stackoverflow.com/questions/63192684
复制相似问题