2011-09-20 22 views
0

我有从我正在写一个程序解析参数的问题,代码如下:getopt_long问题

void parse_args(int argc, char** argv) 
{ 
    char ch; 
    int index = 0; 

    struct option options[] = {  
     { "help", no_argument, NULL, 'h' },  
     { "port", required_argument, NULL, 'p' },  
     { "stop", no_argument, NULL, 's' },   
     { 0, 0, 0, 0 }  
    }; 

    while ((ch = getopt_long(argc, argv, "hp:s", options, &index)) != -1) { 
     switch (ch) { 
      case 'h': 
       printf("Option h, or --help.\n"); 
       break; 
      case 's': 
       printf("Option s, or --stop.\n"); 

       break; 
      case 'p': 
       printf("Option p, or --port.\n"); 
       if (optarg != NULL) 
        printf("the port is %s\n", optarg); 
       break; 
      case '?': 
       printf("I don't understand this option!!!\n"); 

      case -1: 
       break; 
      default: 
       printf("Help will be printed very soon -:)\n"); 
     } 
    } 
} 

当我运行我的程序,我得到一些奇怪的输出:

./Server -p 80 
Option p, or --port. 
the port is 80 

./Server -po 80 
Option p, or --port. 
the port is o 

./Server -por 80 
Option p, or --port. 
the port is or 

./Server -hoho 
Option h, or --help. 
Server: invalid option -- o 
I don't understand this option!!! 
+0

为什么它很奇怪?你期望什么? –

+1

最后三个执行输出很奇怪!!! – funnyCoder

+1

不,不是。你传递'-p',它将下一个事物('o'或'or')解释为计数,并忽略'80'。 'p'应该在'o'和'r'之后。在第四轮中,它只计算一次每个字母。 –

回答

7

我认为这种困惑源于对长时间选择的误解。基本上它只会在你使用--表单时才会进行部分字符串匹配。当您仅使用-时,它将回退到标准解析,因此-por 80-p or 80(如,选项为-p且参数为or)相匹配。尝试与--po--por一样的事情。至于帮助,请尝试--he--hel

+0

感谢它更清楚,所以如果我明白处理用户输入的唯一安全方式是使用类似strcmp()来验证用户字符串? – funnyCoder

+1

@funnyCoder还有另一个调用'getopt_long_only'。检查出 –

+0

' getopt_long_only'确实是OP想要的,我想... –