Использование getopt () в C ++ для обработки аргументов - PullRequest
0 голосов
/ 23 сентября 2018

Программа работает следующим образом, аргумент вначале указывается в такой форме:

-w cat

Строка "cat" хранится впеременная pattern и для каждой буквы, за которой следует - , мы что-то делаем;в этом случае мы устанавливаем mode = W. У меня проблемы с тем, что аргумент имеет вид:

-w -s -n3,4 cat

Теперь я считаю, что, как и раньше, mode устанавливается в W, S и N в порядке чтения.И если я захочу сохранить / запомнить, какой порядок следования букв mode был установлен после завершения цикла, я могу сохранить информацию в массиве.Также, как и должно быть сделано pattern присваивается строка "cat".Поправьте меня, если я ошибаюсь или есть более простой способ сделать это.

Во-вторых, я хочу иметь возможность доступа и сохранения номеров 3 и 4. Я не уверен, как это делается, и яне уверен, что argc - = optind;и argv + = optind;делает.За исключением того, что я думаю, что аргументы хранятся в строковом массиве.

enum MODE {
    W,S,N
} mode = W;
int c;
while ((c = getopt(argc, argv, ":wsn")) != -1) {
    switch (c) {
        case 'w': 
            mode = W;
            break;
        case 's': 
            mode = S;
            break;
        case 'n':
            mode = N;
            break;   
    }
}
argc -= optind; 
argv += optind; 

string pattern = argv[0];

Обновление: выяснил, как получить доступ к числам, мне просто нужно было посмотреть, что было в argv во время цикла.Так что, я думаю, я просто сохраню найденное значение в другой переменной для использования.

1 Ответ

0 голосов
/ 23 сентября 2018

getopt устанавливает глобальную переменную optarg, когда указан параметр со значением.Например:

for(;;)
{
  switch(getopt(argc, argv, "ab:h")) // note the colon (:) to indicate that 'b' has a parameter and is not a switch
  {
    case 'a':
      printf("switch 'a' specified\n");
      continue;

    case 'b':
      printf("parameter 'b' specified with the value %s\n", optarg);
      continue;

    case '?':
    case 'h':
    default :
      printf("Help/Usage Example\n");
      break;

    case -1:
      break;
  }

  break;
}

См. здесь для более полного примера.

Я хочу иметь возможность доступа и сохранения номеров 3 и 4.

Поскольку это список с разделителями-запятыми, вам необходимо проанализировать optarg для токенов (см. strtok), а затем использовать atoi или аналогичный для преобразования каждого в целое число.

...