gpt4 book ai didi

c++ - Using getopt when options have options C++

转载 作者:行者123 更新时间:2023-11-30 03:36:47 24 4
gpt4 key购买 nike

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

我的想法是,我会将子字符串从 8 到末尾(或“打开”选项为 5),因为这会忽略字符串的“链式”部分,然后使用 atof() 将其转换为双然后声明我的 map 。我相信 optarg 是一个字符数组(?),即使我尝试过 std::string str(optarg); 我也一直遇到类型不匹配错误我也不知道该写什么else if (strcasecmp(optarg, "chained") == 0) 因为它的末尾可能有任何数字。所以现在当我执行 -b chained-0.75 时,它会调用 usage 函数。

这是我目前所拥有的:

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()

关于c++ - Using getopt when options have options C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40499531/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com