Как обрабатывать аргументы командной строки в C ++, который имеет отрицательный знак (-) в терминале Linux? - PullRequest
0 голосов
/ 31 октября 2018

Мне нужно это для назначения. Я знаю, как стандартный ввод командной строки работает в C ++. если у меня есть исполняемый файл с именем training, я могу написать в терминале следующую строку:

./training input.text output1 output2

В этом случае мой основной метод будет выглядеть следующим образом:

int main( int argc, char* argv[] ){
     take_input( argv[1] );
     make_output( argv[2], argv[3] );
}

И мои объявления функций будут следующими:

int take_input( string filename );
int make_output( string filename, string filename2 )

Однако мне нужно написать командную строку следующим образом:

training -i input.csv -os output1 -oh output2

Я не знаю, как сделать изменения. Помощь будет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

getopt() будет работать, но если ваши потребности минимальны, и вы не хотите добавлять внешнюю зависимость, вы можете написать свою собственную маленькую вспомогательную функцию, чтобы найти, где ключевые слова dash находятся внутри массива argv, как это:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// Returns the index of the specified keyword (e.g. "-oh")
// or returns -1 if the keyword doesn't exist
static int find_keyword(int argc, char *argv[], const char * keyword)
{
   for (int i=0; i<argc; i++)
   {
      if (strcmp(argv[i], keyword) == 0) return i;
   }
   return -1;
}

int main( int argc, char* argv[] )
{
   const int iIndex = find_keyword(argc, argv, "-i");
   if (iIndex < 0) {printf("No -i keyword found!  Exiting!\n"); exit(10);}

   const int osIndex = find_keyword(argc, argv, "-os");
   if (osIndex < 0) {printf("No -os keyword found!  Exiting!\n"); exit(10);}

   const int ohIndex = find_keyword(argc, argv, "-oh");
   if (ohIndex < 0) {printf("No -oh keyword found!  Exiting!\n"); exit(10);}

   take_input( argv[iIndex+1] );
   make_output( argv[osIndex+1], argv[ohIndex+1] );
}

Обратите внимание, что показанная программа не проверяет, существует ли следующий аргумент после аргумента dash; например если вы запустили "./a.out -i foo -os bar -oh", то второй аргумент make_output будет передан как NULL. Вы можете изменить find_keyword(), чтобы проверить эту возможность, и вернуть -1 в этом случае, если вы хотите быть более надежным в обработке ошибок.

0 голосов
/ 31 октября 2018

В Linux вы просто включаете unistd.h и используете getopt.

...