2016-11-09 55 views
1

我使用getopt来解析命令行参数,我的问题是我的一些选项有选项。我的项目是测试映射的不同后端实现,-b标志指定要使用的实现。大多数选项都很简单,但对于使用散列表(链接和打开)的后端,还有一个附加的数字可以添加到最后以指定加载因子。所以这将是-b chained-0.75当选项有选项时使用getopt C++

我的想法是,我会从8到最后(或5为“打开”选项)的子字符串,因为它会忽略字符串的“链接”部分,然后使用atof()来转换它加倍,然后宣布我的地图。我相信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; 

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

回答

2

strcasecmp()是一个完全匹配的比较函数,这个strcasecmp()明显不符合“chained-0.75”。 strcasecmp()匹配字符串“链接”的唯一的事情是“链接”,而不是“链接-0.75”,而不是“改变 - foobar”,而不是“链接任何东西”。

右边的功能是strncasecmp

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

注意,您比较反对“链状式”,而不仅仅是“链接”。思考的一些时刻应该明确为什么。

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

+0

这正是我所需要的,解决了我的一个问题 - 谢谢! – Catherine