Проверка argv [] на строку? (С++)

Итак, я пытаюсь проверить аргументы, которые я вводил в свою программу, и одно из них - это либо слово "да", либо "нет", введенное без кавычек.

Я пытаюсь проверить эквивалентность (if (argv [n] == "yes" )), но это, кажется, возвращает false каждый раз, когда вход является, по сути, да (когда я его выводил, он подтверждает это). Что мне здесь не хватает, что я делаю неправильно? Если я правильно понимаю, argv [n] возвращает строку cstring с нулевым завершением, поэтому она должна позволять мне это делать.

Ответы

Ответ 1

Вы сравниваете указатели. Используйте strcmp или std::string.

int main(int argc, char * argv[]) {

  if (argv[1] == "yes"); // Wrong, compares two pointers
  if (strcmp(argv[1], "yes") == 0); // This compares what the pointers point to
  if (std::string(argv[1]) == "yes"); // Works fine
  if (argv[1] == std::string("yes")); // Works fine

  // Easy-mode    
  std::vector<std::string> args(argv, argv+argc);
  for (size_t i = 1; i < args.size(); ++i) {
      if (args[i] == "yes") {
          // do something
      }
  }

}

Ответ 2

if(strcmp(argv[0],"yes")==0) { // equal to "yes"

strcmp равен нулю, если 2 строки одинаковы.

Ответ 3

Вы также можете взглянуть на boost:: program_options, хотя это кажется немного не по теме и излишним, но как только вы привыкнете к нему, это легко, удобно и безопасно использовать. Некоторые преимущества автоматически генерируются --help для вашей программы, плюс такие вещи, как оценка строки может быть выполнена безопасно с помощью lexical_cast.

Ответ 4

Здесь лучшая альтернатива std::string, и когда эффективность важна - в С++ 17 у вас теперь есть очень полезный std:: string_view. Это позволяет работать с аргументами аналогично std::string, не прибегая к затратам на копирование.

В настоящее время доступно в std:: experimental в GCC:

#include <experimental/string_view>
...
if(std::experimental::string_view(argv[1]) == "yes") {
  // do things
}