【问题标题】:command line option命令行选项
【发布时间】:2012-11-25 04:28:40
【问题描述】:
#include <iostream>
#include <cstdlib>
#include <sstream>
#include <fstream>
using namespace std;

    int main(int argc, char* argv[]) 
    {
    cout << argv[1] << endl;
    if (argv[1]=="-r") cout << "success\n";
    }

“成功”不会打印出来。当我运行时: $ ./hearts -r 唯一出来的是:

-r

这让我很困惑

【问题讨论】:

  • 你不能用==比较字符串,欢迎来到C/C++的世界;D也欢迎来到SO,漂亮的个人资料图片:)

标签: c++ command-line-arguments


【解决方案1】:

我会继续告诉你,你不想要strcmp。 C++处理命令行参数的方式是尽快把它们转成std::strings:

int main(int argc, const char* argv[])
{
  // Make a vector of all command-line arguments
  std::vector<std::string> args(argv, argv+argc);
  // Now we can use std::string's operator==
  if (args.size() > 1 && args[1] == "-r") {
    std::cout << "Success" << std::endl;
  }
  return 0;
}

您可以将两个std::strings 与== 运算符进行比较。在args[1] == "-r" 的情况下,const char[] 字符串文字被转换为std::string 以进行比较。在您的代码中,argv[1]=="-r" 比较两个不相等的独立指针 - 它不比较 C 样式字符串的内容。

【讨论】:

  • 那我要告诉你,你不想要std::endl。只需使用 '\n' 代替(它甚至更短!)。对于选项解析,您可能需要 getopt 之类的东西,而不是手动 if/else 检查。
  • @melpomene 但是\n 不会刷新流。
  • 如果cout 是一个终端就可以。另外,这里没关系,因为程序无论如何都将退出,这会刷新所有流。
  • @melpomene 我认为std::endl 更适合教学。我不想让人们养成坏习惯。
  • +1 因为 - 除了关于 endl 的参数 - 这实际上显示了 C++ 代码。
【解决方案2】:

那是因为您在两个指针上使用了==。它会检查指针是否相等,而不是检查指向的数据是否相同。

要比较两个 C 字符串,请像这样使用strcmp

if (strcmp(argv[1], "-r") == 0)

【讨论】:

    【解决方案3】:

    您应该尝试使用:

    if (strcmp(argv[1],"-r")==0) cout << "success\n";
    

    将参数与字符串文字进行比较。

    【讨论】:

      【解决方案4】:

      您可能希望strcmp 比较两个字符串。要使== 为真,您的两个字符串必须引用相同的内存位置,这是不可能的,因为"-r" 是一个编译时常量。

      【讨论】:

        【解决方案5】:

        您应该使用strcmp(),它会按预期工作。当您使用== 时,您会比较指针,它们不能相同。

        【讨论】:

          【解决方案6】:

          在 C 中,字符串是字符数组(指向字符序列的指针)。在您的代码中,相等运算符只是比较两个指针值,它们是完全不同的。你应该使用strcmp函数,或者使用string类:

          #include <iostream>
          #include <cstdlib>
          #include <sstream>
          #include <fstream>
          #include <cstring> // <-- here
          
          using namespace std;
          
          int main(int argc, char* argv[]) 
          {
              cout << argv[1] << endl;
              if (strcmp(argv[1], "-r") == 0) // <-- and here
                  cout << "success\n";
          }
          

          #include <iostream>
          #include <cstdlib>
          #include <sstream>
          #include <fstream>
          #include <string> // <-- here
          
          using namespace std;
          
          int main(int argc, char* argv[]) 
          {
              cout << argv[1] << endl;
              if (string(argv[1]) == "-r") // <-- and here
                  cout << "success\n";
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-09-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-06-14
            • 1970-01-01
            • 1970-01-01
            • 2021-12-21
            相关资源
            最近更新 更多