2012-09-22 53 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語言中問號的字面積