Я использую getopt для анализа аргументов командной строки, и моя проблема в том, что некоторые из моих опций имеют параметры. Мой проект заключается в тестировании различных вариантов реализации карт, а флаг -b указывает, какую реализацию использовать. Большинство опций являются прямыми, но для бэкэнд, которые используют хеш-таблицы (прикованные и открытые), есть дополнительный номер, который можно добавить в конец, чтобы указать коэффициент нагрузки. Так было бы -b chained-0.75
.Использование getopt, когда параметры имеют параметры C++
Моя идея в том, что я возьму подстроку от 8 до конца (или 5 для опции «open»), потому что это будет игнорировать «цепочку» части строки, а затем использовать 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