2016-11-09 4 views
1

Я использую 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; 

Любые намеки или идеи будут оценены!

ответ

2

strcasecmp() - это точная функция сравнения по сопоставлению, эта strcasecmp(), очевидно, не соответствует "chain-0.75". Единственное, что strcasecmp() будет соответствовать строчке «цепной», «прикован», а не «прикованный-0,75», а не «измененный-foobar», а не «прикованный-ничего».

Правая функция strncasecmp:

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

Обратите внимание, что вы сравниваете против "chained-", а не просто "прикован". Несколько моментов мышления должны дать понять, почему.

Существующий код также не учитывает возможность того, что строка после «цепочка» не является числом, так как atof() не обрабатывает ошибки синтаксического анализа. Если вам нужно обнаружить и обработать ошибку здесь, используйте strtod() вместо atof().

+0

Это именно то, что мне было нужно, это решило одну из моих проблем - Спасибо! – Catherine

Смежные вопросы