2012-09-22 29 views
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; 
} 

此代码编译罚款,但是当我运行它想:解析'?'在getopt的

./a.out ? 

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

+1

您错过了 - 。选项全部以 - 开头。 ?不是一种选择。 (实际上它是一个shell元字符,它可以匹配任何单字符文件名,所以它可能根本不会传递给你的程序。试试./a.out - ?(并注意getopt返回的其他注释)。 – rici

回答

2

问号'?'是getopt当它发现一个参数这不是optstring或如果它检测到一个缺少的选项参数,所以你不应该使用'?'在optstring,因为它是一种保留,而不是你应该使用更传统的'h'的帮助。

参见man page

编辑: 这是一个例子:

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); 
} 
+0

如何显示消息然后显示'?' – Bruce

+0

我的意思是你不应该将它用作optstring的一部分,因为getopt会在a)看到一个未知选项时返回'?'b)有一个缺少参数c)它看到'?'字符,但是当然你可以在开关盒中使用它。 – iabdalkader

-1

常量字符* optString =; “H?”

以上符合以下行

常量字符* optString =替换 “H \?”;

这是C语言中问号的字面积