【问题标题】:getopt_long problemgetopt_long 问题
【发布时间】:2011-11-21 09:23:36
【问题描述】:

我在从我正在编写的程序中解析参数时遇到问题,代码如下:

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!!!

【问题讨论】:

  • 为什么奇怪?你期待什么?
  • 最后三个执行输出奇怪!!!
  • 不,不是。你传递了-p,它会将下一件事(oor)解释为计数,并忽略80p 应该在 or 之后。在第四次运行中,它只计算每个字母一次。
  • 哦。它接受折叠在一起的单字母选项,就像在 Unix 中键入 ls -ltr 时一样。你不知道吗?退出!!!,这不像你是这里任何人的老板。
  • 至于 getopt(),它可以工作,但它的行为不像您认为的那样。欢迎来到您余下的编码生涯。如果你想改变它,你将不得不自己做。或者你将不得不接受一种不同的解析输入的方式。而且无论如何,您都必须验证您的输入。相信我。

标签: c command-line-arguments getopt-long


【解决方案1】:

我认为混淆源于对 long get opt 的误解。本质上,只有当您使用 -- 表单时,它才会进行部分字符串匹配。当您只使用- 时,它将回退到标准解析,因此-por 80 匹配为-p or 80(如,选项为-p,参数为or)。用--po--por 尝试同样的事情。如需帮助,请尝试--he--hel

【讨论】:

  • 谢谢它更清楚,所以如果我理解处理用户输入的唯一安全方法是使用类似 strcmp() 的东西来验证用户字符串?
  • @funnyCoder 还有另一个电话getopt_long_only。看看
  • 谢谢大家,你们的帮助很棒:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 2017-02-19
  • 2012-02-16
  • 2015-04-30
  • 2014-06-01
  • 1970-01-01
相关资源
最近更新 更多