检查字符串argv []? (C ++)

时间:2011-03-03 16:00:01

标签: c++

所以我试图检查我输入到程序中的参数,其中一个是“是”或“否”,输入时没有引号。

我正在尝试测试等效性(if(argv [n] ==“yes”))但是每当输入实际上是肯定时,它似乎都返回false(当我输出它时它确认了这一点)。我在这里错过了什么,我做得不正确? 如果我理解正确argv [n]返回一个以null结尾的cstring,那么它应该允许我这样做。

5 个答案:

答案 0 :(得分:49)

你在比较指针。使用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
      }
  }

}

答案 1 :(得分:3)

这是std :: string的更好替代方案,当效率很重要时 - 在C ++ 17中,你现在拥有非常有用的std::string_view。这使您可以使用类似于std :: string的参数,而不会产生复制成本。

目前在GCC中的std :: experimental中可用:

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

答案 2 :(得分:2)

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

如果2个字符串相同,则strcmp为零。

答案 3 :(得分:1)

您还可以查看 boost :: program_options ,虽然这看起来有些偏离主题并且有些过分,但是一旦您习惯了它,它就会变得简单,方便和安全。自动生成一些优点 - 帮助您的程序,以及类似的东西 使用lexical_cast可以安全地完成字符串评估。

答案 4 :(得分:0)

如果您不知道参数的确切位置,您可以考虑使用 find_if (C++17):

#include <algorithm>
#include <string>

int main(int argc, char * argv[])
{
    auto const begin = argv;
    auto const end = argv + argc;

    auto is_yes = [](std::string const & s) { return s == "yes"; };
    auto const it = std::find_if(begin, end, is_yes);

    // do stuff with `it`
    // ....
}