2013-02-14 1 views
0

Это домашнее задание сначала.Сканировать аргументы и определять, что они представляют собой с помощью программы C++

Мы должны создать «общую модель прикладного программирования в UNIX/Linux, известную как фильтр».

Я застрял на чтении входных данных, переданных в качестве аргументов (это все, что мне когда-либо кажется неприятным).

Например, CMD открыта и следующая строка вводится:

program -isomebinaryfile.bin 

Мне нужно, чтобы определить, что первая буква после дефиса (-) и так далее и так далее.

scanf Что я буду использовать? Мой main настроен, чтобы иметь возможность принимать аргументы:

int main (int argc, char *argv[]) 
{ 
FILE *inf = NULL; 
char *arg = argv[0]; 
} 

Может кто-то дать мне немного помочь?

ответ

1

Если ваше задание не только для обработки обработки аргументов, вы можете посмотреть getopt - это стандартный анализатор библиотек для аргументов.

Что касается мяса вашего вопроса, есть много вариантов, и вы можете использовать sscanf как часть этого, но вам не обязательно.

Чтобы разобрать один аргумент, который вы упомянули, необходимо выполнить следующее: проверить, начинается ли аргумент с -i, извлекать данные из аргумента.

Самый простой способ проверить, если аргумент начинается с -i является:

if (argv[1][0] == '-' && argv[1][1] == 'i') 

В качестве альтернативы, если у вас есть много вариантов аргументов, все, начиная с «-», вы можете что-то вроде:

char * i = NULL; 
char * o = NULL; 
char * s = NULL; 
for (int i = 1; i < argc; ++i) { 
    if (argv[i][0] == '-') { 
     switch(argv[i][1]) { 
      case 'i': 
       i = argv[i][2]; 
       break; 
      case 's': 
       s = argv[i][2]; 
       break; 
      case 'o': 
       o = argv[i][2]; 
       break; 
      default: 
       cerr << "Unknown option: " << argv[i][1]; 
     } 
    } else { 
     cerr << "Error: all options must begin with '-'"; 
    } 

Обратите внимание, я использую ARGV [], а не 0. ARGV [0] всегда является имя исполняемого файла.

Самый быстрый способ извлечь остальную часть аргумента просто указатель арифметика:

char * filename = argv[1] + 2; // (Or you could equivalently say = &argv[1][2] 

Это наиболее эффективный - это повторное использование строк, которые уже в ARGV. Если вы планируете на изменение строки вокруг, вы бы лучше с зЬгсру:

char * filename = (char *)malloc(strlen(argv[1]) - 2); 
strcpy(filename, argv1 + 2); 
// and eventually you'd have to free(filename)... 

Поиграйте и поэкспериментируйте со всеми строковыми функциями. Вы найдете их важными для всех ваших более поздних программ.

+0

очень описательный, благодаря много за помощь. Выученные лоты здесь. – Robolisk

+0

Хотя, я столкнулся с проблемой. Я могу ввести несколько аргументов в одну строку. для exmaple: -isomebinaryfile.bin -oOutputfilename -srec – Robolisk

+0

проверьте «Альтернативно, если у вас есть множество аргументов». Надеюсь, вам должно быть очевидно, как дальше оттуда, если у вас есть дополнительные возможности. –

0

Получить аргументы от argv ("вектор-аргумент"). В вашем примере, argc и argv будет выглядеть следующим образом:

argc == 2 
argv[0] == "cmd" 
argv[1] == "-isomebinaryfile.bin" 

найти первую букву после дефиса в argv[1] простой цикл.

1

Вам необходимо использовать getopt. Например, на странице руководства.

1

argv представляет собой массив строк. Вы можете цикл над ними, как

for (int i=1; i<argc; i++) { // skip argv[0] as that's this program's name 
    const char* arg = argv[i]; 
} 

После того, как у вас есть строка для конкретного аргумента, вы можете использовать функции работы со строками из <string.h>

if (arg[0] == '-' && strlen(arg) > 0) { 
    arg++; // advance past the leading '-' 
    if (strcmp(arg, "command_one") == 0) { 
     // handle command_one 
    } 
    else if (strcmp(arg, "command_one") == 0) { 
     .... 
    else { 
     printf("Error: unexpected command %s\n", arg); 
    } 
+0

'argv [0]' это имя исполняемого файла –

+0

@EdHeal Да. Я не хотел предлагать иное. Я постараюсь исправить свой ответ, если вы сможете подтвердить, что, казалось, вводит в заблуждение. Начал ли первый цикл из 0, а не 1? – simonc

+0

Я предпочел бы цикл while в цикле 'for' для этого, так как вы можете нерегулярно перемещаться по аргументам в зависимости от того, сколько параметров требуется для параметра командной строки. –

Смежные вопросы