在C ++中检查特定的命令行参数

时间:2019-04-03 08:41:30

标签: c++ command-line-arguments

我正在构建一个CLI应用程序,该应用程序应该执行以下操作:

./app

Welcome to the app, Type -h or --help to learn more.

./app -h

list of commands:...

这是我要构建的代码:

#include <iostream>

using namespace std;

int main(int argc, char** argv)  {

   cout << "Welcome to the app. Type -h or --help to learn more\n";

   if(argv == "-h" || argv == "--help") {
      cout << "List of commands:...";
   }
  return 0;
}

但是当我尝试编译gcc时,会出现以下错误:

error: comparison between distinct pointer types ‘char**’ and ‘const char*’ lacks a cast [-fpermissive]
    if(argv == "-h" || argv == "--help") {
               ^~~~
error: comparison between distinct pointer types ‘char**’ and ‘const char*’ lacks a cast [-fpermissive]
    if(argv == "-h" || argv == "--help") {
                               ^~~~~~~~

4 个答案:

答案 0 :(得分:5)

从C ++ 17开始,编写此代码的最佳方法如下:

#include <iostream>
#include <string_view>

int main(int argc, char** argv) {
    using namespace std::literals;

    std::cout << "Welcome to the app. Type -h or --help to learn more\n";

    if (argv[0] == "-h"sv || argv[0] == "--help"sv) {
       std::cout << "List of commands:...";
    }
}

string_view标头存在之前,您可以使用""s std::string文字,它产生与上面相同的代码,只包括string标准标头和将"…"sv更改为"…"s。不幸的是,这样的代码会导致多余的分配,但是在这个特定示例中,这是不相关的。

答案 1 :(得分:4)

argv是char *的指针。

您必须首先选择要访问的argc参数。

例如argv [2]作为第三个参数。

您不能在char *上用==进行stringcompare比较,您必须使用strcmp或从char *构造一个字符串对象,如下所示: 字符串arg2 = argv [2];

然后您可以执行arg2 ==“ --help”

答案 2 :(得分:2)

如果要使用==运算符,则需要遍历参数数组并将char数组转换为字符串

#include <iostream>
#include <string>

using namespace std;

int main(int argc, char** argv)  {

    cout << "Welcome to the app. Type -h or --help to learn more\n";

    for(int i=0;i<argc;i++)
    {
        if(string(argv[i]) == "-h" || string(argv[i]) == "--help")
        {
            cout << "List of commands:...";
        }
    }
    return 0;
}

答案 3 :(得分:-1)

您不能像比较整数那样比较字符串!!! 使用strcmp / stricmp