选项具有选项C ++

时间:2016-11-09 02:40:41

标签: c++ getopt

我使用getopt来解析命令行参数,我的问题是我的一些选项有选项。我的项目是测试映射的不同后端实现,-b标志指定要使用的实现。大多数选项都是直接的,但对于使用哈希表(链接和打开)的后端,可以添加一个额外的数字,以指定加载因子。所以它会是-b chained-0.75

我的想法是,我将子串从8到最后(或5为“打开”选项),因为这将忽略字符串的“链式”部分,然后使用atof()将其转换为一个双,然后声明我的地图。我相信optarg是一个char数组(?),我仍然遇到类型不匹配错误,即使我已经尝试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;

任何提示或想法都将不胜感激!

1 个答案:

答案 0 :(得分:2)

strcasecmp()是完全匹配比较函数,此strcasecmp()显然不匹配" chained-0.75"。 strcasecmp()唯一匹配字符串"链接"是"链接",不是"链接-0.75",不是"改变了foobar"而不是"链接 - 任何东西"。

正确的功能是strncasecmp

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

请注意,您要与" chained - "进行比较,而不仅仅是"链接"。一会儿'思考应该明确原因。

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