我使用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;
任何提示或想法都将不胜感激!
答案 0 :(得分:2)
strcasecmp()
是完全匹配比较函数,此strcasecmp()
显然不匹配" chained-0.75"。 strcasecmp()
唯一匹配字符串"链接"是"链接",不是"链接-0.75",不是"改变了foobar"而不是"链接 - 任何东西"。
正确的功能是strncasecmp
:
} else if (strncasecmp(optarg, "chained-", 8) == 0) {
请注意,您要与" chained - "进行比较,而不仅仅是"链接"。一会儿'思考应该明确原因。
现有的代码也没有考虑到"链接后的字符串的可能性 - "不是数字,因为atof()
不处理解析错误。如果您需要在此处检测并处理错误,请使用strtod()
代替atof()
。