0
void display(char * str){
   printf("%s: Missing file\n", str);
}

int main(int argc, char **argv)
{

    int longIndex, opt = 0;
    const char *optString = "h?";

    static const struct option longOpts[] = {
    { "help", no_argument, NULL, 'h' },
    { NULL, no_argument, NULL, 0 }
    };

    opt = getopt_long( argc, argv, optString, longOpts, &longIndex );
    while( opt != -1 ) {
        switch( opt ) {
            case 'h':
            case '?':
                display(argv[0]);
                break;

            default:
                break;
        }

        opt = getopt_long( argc, argv, optString, longOpts, &longIndex );
    }

        return 0;
}

这段代码编译得很好,但是当我像这样运行它时:

./a.out ?

它不调用显示。我错过了什么?

4

3 回答 3

2

问号“?” 当 getopt 找到不在optstring中的参数或检测到缺少选项参数时,由getopt返回,因此您不应使用 '?' 在optstring中,因为它是为此保留的,因此您应该使用更传统的 'h' 来寻求帮助。

请参阅手册页

编辑:这是一个例子:

switch (opt) {
    case 'n':
        some_flag = 1;
        break;
    case 'h': /* help */
    default: /* '?' unknown opt or missing arg*/
        fprintf(stderr, "Usage: %s [-n nsecs] \n", argv[0]);
        exit(EXIT_FAILURE);
}
于 2012-09-22T05:28:00.097 回答
0

如果你包括 - ?在您的帮助消息中使用--help,将问号从您的getopt呼叫中删除,将其从case选项中删除,并确保--help是您列表中的第一个case选项,问号会像您一样工作会想要的。

于 2020-11-27T17:46:00.623 回答
-1

const char *optString = "h?";

上面的行替换为下面的行

const char *optString = "h\?";

这是C语言问号的文字

于 2012-09-22T05:30:20.863 回答