2012-07-12 79 views
0

我在使命令行參數正常工作時遇到問題。當argc高於3時,參數似乎失敗,之後只有在編寫時才能使它們工作 - 無論是而是-f任何都應該如此。 -t也複製-o的值。命令行參數不起作用。某種邏輯錯誤

int main(int argc,char **argv) 
{ 
    int c; 

    /* Are we in root? */ 

    if(geteuid() !=0) 
     { 
      printf("Root access is required to run this program. \n"); 

      exit(0);   
     } 

    /* How do we use the program */ 

    if ((argc < 6) || (argc > 8)) 
     { 
      usage(argv[0]); 

      exit (0); 
     } 

    while (1) 
     { 
      static struct option long_options[] = 
       { 
        /* Options */ 
       {"send",  no_argument,  0, 's'}, 
       {"recieve", no_argument,  0, 'r'}, 
       {"file",  required_argument, 0, 'f'}, 
       {"data",  required_argument, 0, 'd'}, 
       {"destip",  required_argument, 0, 'i'}, 
       {"destport", required_argument, 0, 'p'}, 
       {"sourceip", required_argument, 0, 'o'}, 
       {"sourceport", required_argument, 0, 't'}, 
       {0, 0, 0, 0} 
       }; 

       int option_index = 0; 

       c = getopt_long (argc, argv, "srf:d:i:p:o:t:", 
          long_options, &option_index); 

          /* Detect the end of the options. */ 
       if (c == -1) 
       break; 

       switch (c) 
       { 
       case 0: 
        /* If this option set a flag, do nothing else now. */ 
        if (long_options[option_index].flag != 0) 
       break; 
        printf ("option %s", long_options[option_index].name); 
        if (optarg) 
       printf (" with arg %s", optarg); 
        printf ("\n"); 
        break; 

       case 's': 
        puts ("option -s\n"); 
        break; 

       case 'r': 
        puts ("option -r\n"); 
        break; 

       case 'f': 
        printf ("option -f with value `%s'\n", optarg); 
        break; 

       case 'd': 
        printf ("option -d with value `%s'\n", optarg); 
        break; 

       case 'i': 
        printf ("option -i with value `%s'\n", optarg); 
        break; 

       case 'p': 
        printf ("option -p with value `%s'\n", optarg); 
        break; 

       case 'o': 
        printf ("option -o with value `%s'\n", optarg); 

       case 't': 
        printf ("option -t with value `%s'\n", optarg); 


       case '?': 
        /* Error message printed */ 
        break; 

       default: 
        abort(); 
       } 
      } 

       /* Print any remaining command line arguments (not options). */ 
      if (optind < argc) 
     { 
      printf ("non-option ARGV-elements: "); 
      while (optind < argc) 
      printf ("%s ", argv[optind++]); 
      putchar ('\n'); 
     } 

     getchar(); 
     exit (0); 

} 

這裏顯然有一些可怕的錯誤,但它似乎無法找到它。

回答

2

關於-o複製到-t,你忘了把一個break;在案件的最後。

此外,我會刪除argc檢查。讓getopt發揮它的魔力。如果所有強制選項都已設置,則可以在解析結束時進行檢查。你也可以檢查未知的參數。

+0

多少次,我曾經把我的頭髮撕成同樣的問題!編譯器應該停止編譯這些東西。或第二開關構造。在每種情況下都可以無中斷地進行編譯。但切換正確不會編譯。 – Aftnix 2012-07-12 21:49:20

+0

謝謝@eyalm!很容易錯過那樣的東西。關於什麼是檢查強制選項的最佳方法的任何建議? – youjustreadthis 2012-07-14 13:35:54

+0

只需將所有選項變量設置爲NULL即可。運行getopt後,確保它們都已初始化。 – eyalm 2012-07-14 15:40:28

相關問題