繁体   English   中英

C中getopt的错误处理

[英]error handling of getopt in C

我对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_longonly (以及其他getopt函数)将optind extern变量设置为指向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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM