解析’?’ 在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语言中的问号字面