Проверка 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
}