【问题标题】:error handling of getopt in CC中getopt的错误处理
【发布时间】:2014-10-15 10:34:09
【问题描述】:

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

【问题讨论】:

    标签: c getopt getopt-long


    【解决方案1】:

    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和@ 987654348@ 是"fsfs"

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

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

    【讨论】:

    • 是的,但是某些命令可能有非选项参数,例如调用命令列表“base -show 1 1”是有效的,但是如果我添加这个 if (optind
    • 重点是 getopt 不能验证非选项参数,所以如果它看到一些看起来不像选项的东西,例如fsfs,它跳过了这个参数。您应该手动验证非选项参数。
    • 在linux下,貌似optind没有增加,如果输入的是base -show 1 1,while后面optind是2,而base--optind也是2,怎么办它
    • 总是等于第一个非选项参数的位置。在-show 1 1 中它指向第一个1,在-- 中它指向NULL 值,因为没有非选项参数。
    猜你喜欢
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    相关资源
    最近更新 更多