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

-w кот

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

-w -s -n3,4 кот

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

Во-вторых, я хочу иметь доступ и сохранять числа 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 во время цикла. Думаю, я просто сохраню найденное значение в другой переменной для использования.

4
user9111757 23 Сен 2018 в 18:21

1 ответ

Лучший ответ

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 или что-то подобное для преобразования каждого из них в целое число.

5
Geoffrey 23 Сен 2018 в 17:11