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 в этом случае, если вы хотите быть более надежным в обработке ошибок.