Проверка конкретных аргументов командной строки в C ++ - PullRequest
0 голосов
/ 03 апреля 2019

Я создаю приложение 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 ]

5 голосов
/ 03 апреля 2019

Начиная с 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 , К сожалению, такой код приводит к избыточному распределению, но в данном конкретном примере это не имеет значения.

4 голосов
/ 03 апреля 2019

argv - указатель на символ *.

Вы должны сначала выбрать, к какому из аргументов argc вы хотите обратиться.

например. argv [2] для третьего аргумента.

И вы не можете выполнить сравнение строк с == на символе *, вы должны либо использовать strcmp, либо создать строковый объект из символа *, например, так: строка arg2 = argv [2];

тогда вы можете сделать arg2 == "--help"

2 голосов
/ 03 апреля 2019

Вам нужно перебрать массив аргументов и преобразовать массив 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;
}
0 голосов
/ 03 апреля 2019

Вы не можете сравнивать строки, как вы сравниваете целые числа !!! используйте strcmp / stricmp

...