C语言中getopt的错误处理

时间:2014-10-15 10:34:09

标签: c getopt getopt-long

我对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,它就无法处理所有这些无效输入,那么如何处理上面的输入呢?有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

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

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

让我们看看你的例子:

./base --:由于--是一个特殊选项,表明其后的所有内容都不是一个选项,因此该命令行完全有效,等于在没有任何选项的情况下调用./base

./base -:变量optind的值为1,argv[1]"-"。它将单个短划线-视为非选项参数。

./base -- fsfs:此处--被忽略,因为它表明之后只有非选项参数,而fsfs是第一个非选项参数,因此{{1} }将等于2,optindargv[2]

如果您不想要任何非选项参数,只需检查"fsfs"的值是否等于optind。如果它小于argc,则表示您有一些非选项参数:

argc