2016-04-08 2 views
1

Я на самом деле в беде, я хотел бы разобрать несколько аргументов строку как те одно:Синтаксический Multiple Довод линия

./a.out -a 0 L 
./a.out -ab 
./a.out -abc 

Я попытался это сделал с Getopt, но мне не удалось. Дело в том, что я не могу справиться с несколько аргумента, как

./a.out -abc 
./a.out -edg 

Есть ли способ сделать это так, как я хочу с функцией как Getopt?

Или я должен рассмотреть делать (с Getopt):

./a.out -a -b 
./a.out -a -b -c 
+1

Какая у вас проблема при попытке использовать getopt? – danielfranca

+0

Проблема в том, что: «./a.out -a 0 J» - это первый вариант моей программы, который принимает два аргумента. «./a.out -abc» Это еще один вариант, который не принимает ничего другого, что параметры после «-». Поэтому моя проблема в том, что на самом деле я не могу объединить их обоих для разбора моей командной строки. – Exho

+0

Зачем вам нужны 2 параметра? Почему бы не использовать другой синтаксис? т.е.: «./a -a 0, J -abc» – danielfranca

ответ

1

"а ::" делает -a с необязательными аргументами. -a сам устанавливает флаг options, чтобы получить два отдельных аргумента. -aopt с прилагаемыми вариантами принимает opt

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

int main(int argc, char *argv[]) 
{ 
    int c = 0; 
    int each = 0; 
    int options = 0; 

    if (!(argc == 2 || argc == 4)) { 
     fprintf(stderr, "Usage:\t%s -aopt\n or\n\t%s -a opt1 opt2\n", argv[0], argv[0]); 
     return 1; 
    } 
    while((c = getopt(argc, argv, "a::")) != -1) { 

     switch(c) { 
      case 'a': 
       if (optarg) {// -aopt 
        printf ("%s\n", optarg); 
       } 
       else { 
        options = 1;// -a by itself 
       } 
       break; 
      default: 
       fprintf(stderr, "Usage:\t%s -aopt\n or\n\t%s -a opt1 opt2\n", argv[0], argv[0]); 
       return 1; 
     } 
    } 
    if (optind + 2 == argc) { 
     if (options) { 
      for (each = optind; each < argc; each++) { 
       if ((argv[each][0] != '-')) { 
        printf ("found argument %s\n", argv[each]); 
       } 
      } 
     } 
     else { 
      fprintf(stderr, "Usage:\t%s -aopt\n or\n\t%s -a opt1 opt2\n", argv[0], argv[0]); 
      return 1; 
     } 
    } 

    return 0; 
} 
+0

Это была именно то, что я искал, спасибо огромное! – Exho

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