1

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

4

1 回答 1

0

getopt函数不仅支持选项(例如-hor --help),还支持所谓的非选项参数。例如,如果你写./base --show arg1 arg2, then--show是一个选项,但arg1andarg2是非选项参数。此外,您可以显式--输入选项以显示这些破折号之后的所有参数都是非选项参数。

在您的示例中,像-, sdfs,fsfs之类的选项是非选项参数。getopt_longonly(以及其他getopt函数)将optindextern 变量设置为指向数组中的第一个非选项元素argv

让我们看看你的例子:

./base --: 和--显示后面的所有内容都不是选项的特殊选项一样,这个命令行是完全有效的,等同于./base不带任何选项的调用。

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

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

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

if (optind < argc) {
    /* at least one non-option argument exists */
    printHelp();
}
于 2014-10-15T11:14:29.430 回答