C Getopts: Управление всеми полученными опциями и необязательными оптаргами - PullRequest
0 голосов
/ 24 сентября 2018

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

char flag = 0; // to mark which options were set
int aopt = INT_MAX; // default to INT_MAX if no args delivered
char bemerkung[100];
memset(bemerkung, '\0', 100); // string to receive via '-b'

char option;

while((option = getopt (argc, argv, "m:a:b:")) != EOF){
    switch( option ){
        case 'm': {
            flag = flag | 1;
            break;
        } 
        case 'a': {
            flag = flag | 2;
            char * arg = optarg;
            aopt = atoi(arg);
            if(aopt == 0 && strcmp("0", arg) != 0) // if no valid optarg was entered
                aopt = INT_MAX; // get back the default value
            break;
        }
        case 'b': {
            flag = flag | 4;
            strcpy(bemerkung, optarg);
            break;
        }
        default: {
            fprintf(stderr, "Unknown option entered.\n");
            return -1;
        }
    }
}

// some code here, not touching `flag`

if(flag == 1){
    // deal with `-m`, no optargs
}
if(flag == 2){
    // `-a aopt` called
}
if(flag == 3){
    // `-m -a aopt` called
}

Основная идея состоит в том, чтобы установить биты в flag так, чтобы я мог обработать опции и их комбинации позже.Но проблема, с которой я сталкиваюсь сейчас, заключается в том, что -m требует аргументов (должен быть необязательным только для -m), а ./main -m -a 0 приводит к flag = 1 вместо flag = 3.

Как мне приводить аргументыдля -m необязательно и получите правильное значение OR для flag?

1 Ответ

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

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

while((option = getopt (argc, argv, "ma:b:")) != EOF){
...