C 解析'';在getopt

C 解析'';在getopt,c,C,这段代码编译得很好,但当我像这样运行它时: 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_

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

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;
}

它不调用display。我遗漏了什么?

当它找到一个不在optstring中的参数,或者如果它检测到一个缺少的选项参数,那么你不应该在optstring中使用“?”问号,因为它有点保留,相反,你应该使用更传统的“h”来帮助别人

编辑: 这是一个例子:

./a.out ?
常量字符*optString=“h?”

上面的行替换为下面的行

常量字符*optString=“h\?”


这是C语言中问号的字面意思

如果包括-?在帮助消息中使用--help,在调用getopt时不使用问号,在case选项中不使用问号,并确保--help是列表中的第一个case选项,问号按您的意愿工作。

如何显示“?”的消息?我的意思是您不应该将其用作optstring的一部分,因为getopt会在a)看到未知选项b)缺少arg c)看到“?”字符时返回“?”,但您当然可以在开关情况下使用它。您缺少-。所有选项都以-?这不是一种选择。(实际上,它是一个shell元字符,将匹配任何单个字符的文件名,因此它可能根本不会传递给您的程序。请尝试。/a.out-?(请注意getopt返回的关于?的其他注释)。
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);
}