我使用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;
任何提示或想法,将不胜感激!
这正是我所需要的,解决了我的一个问题 - 谢谢! – Catherine