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

C++ 根据字符串检查argv[]?(C+;+;),c++,C++,因此,我试图检查输入到程序中的参数,其中一个是单词“是”或“否”,输入时没有引号 我试图测试等价性(如果(argv[n]=“yes”)),但每次输入都返回false,事实上,输入是yes(当我输出它时,它确认了这一点)。我在这里遗漏了什么,我做得不对? 如果我理解正确,argv[n]返回一个以null结尾的cstring,因此它应该允许我这样做。您正在比较指针。使用strcmp或std::string int main(int argc, char * argv[]) { if (argv

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

我试图测试等价性(如果(argv[n]=“yes”)),但每次输入都返回false,事实上,输入是yes(当我输出它时,它确认了这一点)。我在这里遗漏了什么,我做得不对?
如果我理解正确,argv[n]返回一个以null结尾的cstring,因此它应该允许我这样做。

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

}
intmain(intargc,char*argv[]){
如果(argv[1]=“yes”);//错误,则比较两个指针
if(strcmp(argv[1],“yes”)==0);//这将比较指针指向的内容
if(std::string(argv[1])==“yes”);//工作正常
if(argv[1]==std::string(“yes”);//工作正常
//简易模式
标准::向量args(argv,argv+argc);
对于(size_t i=1;i

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

您还可以查看一下boost::program\u options,尽管这似乎有点离题,有些过火,但一旦您习惯了它,使用起来就简单、方便、安全了。一些优点是自动生成的——对程序的帮助,以及
使用词法转换可以安全地进行字符串求值。

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

目前可在标准::实验中在GCC中获得:

#include <experimental/string_view>
...
if(std::experimental::string_view(argv[1]) == "yes") {
  // do things
}
#包括
...
如果(标准::实验::字符串_视图(argv[1])==“是”){
//做事
}
< /代码> 现代C++,有点…

/*BINFMTCXX:-Wall-Werror-std=c++17
*/
#包括
#包括
#包括
使用std::string;使用std::vector;使用std::cerr;
int main(int argc,char*const argv[]
{
assert(argc>=1);//explorative--原则上可能会失败,但实际上不会
const向量ARGS(ARGV + 1,ARVV+ARCC);/ /将C风格转换为现代C++

例如,for(auto a:args)cerso“yes”是一个指向字符串文字的指针吗?这很有意义。谢谢。如果使用
std::find
而不是
vector
上的for循环,那么“easer mode”呢?如果std::find是我的一个参数yes,他会问“这个参数是不是?”.不过,这是对问题的解释,重读一遍,我发现你的解释也可能是正确的。@Ben:
“是的”
本身实际上指的是数组而不是指针,但它会按照数组通常的方式衰减为指向第一个元素的指针。哦,天哪,他们最终是否会将
auto
要求放在范围内?恶心:(“将C风格转换为现代C++”它做的不止这些-它邀请
argc+1
不必要的动态分配和
argc
完全不必要的字符串副本。至少让它成为字符串视图的向量…
int main(int argc,char*const argv[])
是不可移植的。(您提供的链接不包括此用法)另外,如果
argc==0
@LightnessRacesinOrbit:你说得对--
auto
在C++17中是必需的。我今天学到了很多。
#include <experimental/string_view>
...
if(std::experimental::string_view(argv[1]) == "yes") {
  // do things
}
/*BINFMTCXX: -Wall -Werror -std=c++17
*/

   #include <iostream>
   #include <string>
   #include <vector>
   using std::string; using std::vector; using std::cerr;

int main( int argc, char * const argv[] )
   {
   assert( argc >= 1 ); // exploratory -- could fail in principle, but not really
   const vector<string> args(argv+1,argv+argc); // convert C-style to modern C++
   for ( auto a : args ) cerr<<(a=="yes")<<"\n"; // operator '==' works as expected
   }