Using getopt when options have options C++

Using getopt when options have options C++

我正在使用 getopt 来解析命令行参数,我的问题是我的一些选项有选项。我的项目是测试地图的不同后端实现,-b 标志指定要使用的实现。大多数选项都是直截了当的,但对于使用哈希表(链式和开放式)的后端,可以在末尾添加一个额外的 -number 来指定负载因子。所以它将是 -b chained-0.75.

我的想法是,我会将子字符串从 8 到末尾(或者 "open" 选项为 5),因为那样会忽略字符串的 "chained-" 部分,然后使用 atof( ) 将其转换为 double,然后声明我的地图。我相信 optarg 是一个字符数组(?),即使我尝试 std::string str(optarg); 我也将 运行 保留为类型不匹配错误,我也不知道该写什么来代替 else if (strcasecmp(optarg, "chained") == 0) 因为它的末尾可以有任何数字。所以现在当我执行 -b chained-0.75 时,它会调用使用函数。

这是我目前的情况:

while ((c = getopt(argc, argv, "hb:n:p:")) != -1) {
    switch (c) {
        case 'b':
            if (strcasecmp(optarg, "unsorted") == 0) {
                map = new UnsortedMap();
            } else if (strcasecmp(optarg, "sorted") == 0) {
                map = new SortedMap();
            } else if (strcasecmp(optarg, "bst") == 0) {
                map = new BSTMap();
            } else if (strcasecmp(optarg, "unordered") == 0) {
                map = new UnorderedMap();
            } else if (strcasecmp(optarg, "chained") == 0) {
                double load_factor;
                std::string str(optarg);
                std::string ld_str = str.substr(8, str.length()-1);
                load_factor = atof(ld_str);
                map = new ChainedMap(load_factor);
            } else if (strcasecmp(optarg, "open") == 0) {
                map = new OpenMap();
            } else {
                usage(1);
            }
            break;

如有任何提示或想法,我们将不胜感激!

strcasecmp()是精确匹配比较函数,这个strcasecmp()显然不会匹配"chained-0.75"。 strcasecmp() 唯一匹配字符串 "chained" 的是 "chained",不是 "chained-0.75",不是 "changed-foobar",不是 "chained-anything".

正确的函数是strncasecmp:

} else if (strncasecmp(optarg, "chained-", 8) == 0) {

请注意,您是在与 "chained-" 进行比较,而不仅仅是 "chained"。稍加思考就会明白为什么。

现有代码也没有考虑到 "chained-" 之后的字符串不是数字的可能性,因为 atof() 不处理解析错误。如果您需要能够检测和处理此处的错误,请使用 strtod() 而不是 atof()