getopt_long не возвращает 0, если в параметре структуры установлен флаг

Я столкнулся с проблемой при использовании getopt_long в C. Как описано, в структуре следующим образом:

struct option{ 
         const char *name; 
         int has_arg; 
         int *flag; 
         int val; 
};

Если флаг установлен, getopt_long должен вернуть 0 и установить *flag как val. Но в моем коде getopt_long return val и *flag остаются без изменений. Код выглядит следующим образом:

#include<stdio.h>
#include<getopt.h>

int help;
int output;
int verbose;

const char *short_option = "ho:v";
const struct option long_options[] = {
    {"help", 0, &help, 'h'},
    {"output", 1, &output, 'o'},
    {"verbose", 0, &verbose, 'v'},
    {NULL, 0, NULL, 0}
};

void print_help()
{
    printf("in option help: \n");
}

void print_output(char *content)
{
    printf("in option output: argument is %s\n",content);
}

void print_verbose()
{
    printf("in option verbose\n");

}

void print_args()
{
    printf("help is %d\n",help);
    printf("output is %d\n",output);
    printf("verbose is %c\n",verbose);
}

int main(int argc, char **argv)
{
    int next_option;
    while( (next_option = getopt_long(argc, argv, short_option, long_options, NULL )) == 0)
    {
        printf("next_option is %c\n",next_option);
        print_args();
    }

    return 0;
}

Кто-нибудь может помочь?


person SpongeDu    schedule 31.05.2013    source источник
comment
Как вы запускаете свою программу? Что я хочу знать, так это начать с длинных или коротких вариантов?   -  person Some programmer dude    schedule 31.05.2013
comment
Я не могу воспроизвести описанное поведение. Здесь все работает нормально, если использовать длинные опции.   -  person alk    schedule 31.05.2013


Ответы (1)


Если вы посмотрите на страницу руководства, вы увидите, что:

getopt_long() и getopt_long_only() также возвращают символ опции, когда распознается короткая опция. Для длинной опции они возвращают val, если флаг равен NULL, и 0 в противном случае.

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

person Some programmer dude    schedule 31.05.2013