解析’?’ 在getopt中

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 ? 

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

问号’?’ getopt在找到不在 optstring中的参数或者它检测到缺少的选项参数时返回,所以你不应该使用’?’ 在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); } 

const char * optString =“h?”;

以上行替换为以下行

const char * optString =“h \?”;

这是C语言中的问号字面