gpt4 book ai didi

c - C中getopt的错误处理

转载 作者:太空宇宙 更新时间:2023-11-04 04:41:11 28 4
gpt4 key购买 nike

我对 C 中 getopt 的错误处理有疑问:

#include <unistd.h>
#include <getopt.h>

void showFunction()
{
printf("show function\n");
}

void printHelp()
{
printf("print help info\n");
}

#define HELP 1
#define SHOW_OPTION 2

int main(int argc, char *argv[])
{
const struct option long_opts[] = {{"help", no_argument, NULL, HELP},
{"show", no_argument ,NULL, SHOW_OPTION},
{NULL, 0, NULL, 0}};
int opt;

while((opt = getopt_long_only(argc, argv, "", long_opts, NULL)) != -1)
{
switch(opt) {
case HELP:
printHelp();
break;
case SHOW_OPTION:
showFunction();
break;
case '?':
printHelp();
break;
default:
printf("type base --help for details\n");
}
}
return 0;
}

这部分会处理一些错误:

case '?':
printHelp();
break;

但是如果我输入 ./base --./base -./base sdfs./base -- fsfs,它无法处理所有这些无效输入,那么如何处理上面的输入呢?谁能帮忙?

最佳答案

getopt 函数不仅支持选项(例如 -h--help),还支持所谓的非选项争论。例如。如果你写./base --show arg1 arg2,那么--show是一个选项,但是arg1arg2 是非选项参数。此外,您可以明确地将 -- 放在您的选项中,以表明这些破折号之后的所有参数都是非选项参数。

在您的示例中,-sdfsfsfs 等选项是非选项参数。 getopt_londonly(以及其他 getopt 函数)将 optind 外部变量设置为指向 argv 中的第一个非选项元素 数组。

让我们看一下您的示例:

./base --:因为 -- 是特殊选项,表明它后面的所有内容都不是选项,此命令行完全有效且相等在没有任何选项的情况下调用 ./base

./base -:变量optind的值为1,argv[1]"-"。它将单破折号 - 视为非选项参数。

./base -- fsfs:此处 -- 被忽略,因为它表明在那之后只有非选项参数,而 fsfs 是第一个非选项参数,因此 optind 将等于 2 并且 argv[2]"fsfs"

如果您不期望任何非选项参数,只需检查 optind 的值是否等于 argc。如果它小于 argc,则意味着您有一些非选项参数:

if (optind < argc) {
/* at least one non-option argument exists */
printHelp();
}

关于c - C中getopt的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26380375/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com