Назначение аргументов командной строки для функций

0

Допустим, я хотел открыть функцию (она открывает файл, что-то делает с ним, а затем выводит результаты в другой файл). Используя argv и argc, а также из всех обучающих онлайн, я предполагаю, что если я напечатаю argv [0], я получу имя файла. Мой вопрос в том, как установить set, скажем, следующую функцию argv [1.2.n] для функции. Поэтому, если пользователь должен был ввести открытый (после того, как пользователь находится в каталоге программы), он откроет эту функцию. Что-то вроде:

  void file();

...

  if (argv[1] == open){
            file();
         }
Теги:
function
void
argv
argc

4 ответа

0
Лучший ответ

argv имеет тип char*[] (массив указателей char *). Вы не можете напрямую сравнивать строковые константы (тип char*), которые вам нужно процитировать. Вместо этого я предлагаю вам преобразовать его в строковый тип c++:

#include <string>

void file(){   
     // ...
}

int main(int argc, char *argv[]) {
        if(argc>=2)
        {
                if(std::string(argv[1]) == "open")
                {
                        file();
                }

        }
        else
        {
                // print usage
        }
}
  • 0
    argv имеет тип char** . В C ++ нет такого понятия, как тип *char[] , и тип char*[] не может быть типом параметра функции.
  • 0
    @JamesKanze Спасибо за ваш комментарий. Я исправлю свой ответ.
1

Первая строка в argv не является первым аргументом командной строки, это обычно путь к exe. Я рекомендую поместить аргументы командной строки в легкую структуру данных.

vector<string> args(argv, argv + argc);

Теперь вы можете передать вектор вашим функциям.

  • 0
    Согласно стандарту argv[0] должно быть «именем, используемым для вызова программы», а не путем к .exe . Конечно, на практике это не реализуемо в Unix, и вы можете получить что угодно в argv[0] .
0

Не совсем понятно, что вы просите. Если целью является вызов разных функций в зависимости от одного из аргументов, обычным решением является использование карты строк для указателей на функции, а затем сделать что-то вроде:

MapType::const_iterator entry = map.find( argv[1] );
if ( entry == map.end() ) {
    std::cerr << "Unknown function " << argv[1] << std::endl;
    returnCode = 1;
} else {
    (*entry->second)();
}
0

Передайте параметры вашей функции:

void file(int * argc, char * * argv)
{
    //
}

int main(int argc, char * * argv)
{
  if (argv[1] == open)
  {
     file(argc, argv);
  }
  return 0;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню