所以我试图检查我输入到程序中的参数,其中一个是“是”或“否”,输入时没有引号。
我正在尝试测试等效性(if(argv [n] ==“yes”))但是每当输入实际上是肯定时,它似乎都返回false(当我输出它时它确认了这一点)。我在这里错过了什么,我做得不正确? 如果我理解正确argv [n]返回一个以null结尾的cstring,那么它应该允许我这样做。
答案 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`
// ....
}