Допустим, я хотел открыть функцию (она открывает файл, что-то делает с ним, а затем выводит результаты в другой файл). Используя argv и argc, а также из всех обучающих онлайн, я предполагаю, что если я напечатаю argv [0], я получу имя файла. Мой вопрос в том, как установить set, скажем, следующую функцию argv [1.2.n] для функции. Поэтому, если пользователь должен был ввести открытый (после того, как пользователь находится в каталоге программы), он откроет эту функцию. Что-то вроде:
void file();
...
if (argv[1] == open){
file();
}
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
}
}
Первая строка в argv не является первым аргументом командной строки, это обычно путь к exe. Я рекомендую поместить аргументы командной строки в легкую структуру данных.
vector<string> args(argv, argv + argc);
Теперь вы можете передать вектор вашим функциям.
argv[0]
должно быть «именем, используемым для вызова программы», а не путем к .exe
. Конечно, на практике это не реализуемо в Unix, и вы можете получить что угодно в argv[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)();
}
Передайте параметры вашей функции:
void file(int * argc, char * * argv)
{
//
}
int main(int argc, char * * argv)
{
if (argv[1] == open)
{
file(argc, argv);
}
return 0;
}
argv
имеет типchar**
. В C ++ нет такого понятия, как тип*char[]
, и типchar*[]
не может быть типом параметра функции.