проблема getopt_long - PullRequest
       29

проблема getopt_long

0 голосов
/ 20 сентября 2011

У меня проблема с разбором аргументов из программы, которую я пишу, код ниже:

void parse_args(int argc, char** argv)
{
    char ch;
    int index = 0;

    struct option options[] = {       
        { "help", no_argument, NULL, 'h'   },      
        { "port", required_argument, NULL, 'p'  },      
        { "stop", no_argument, NULL, 's' },         
        { 0,    0,    0,    0   }       
    };

    while ((ch = getopt_long(argc, argv, "hp:s", options, &index)) != -1) {
        switch (ch) {
            case 'h':   
                printf("Option h, or --help.\n");
                break;
            case 's':
                printf("Option s, or --stop.\n");

                break;
            case 'p':
                printf("Option p, or --port.\n");
                if (optarg != NULL)
                    printf("the port is %s\n", optarg);
                break;
            case '?':
                printf("I don't understand this option!!!\n");

            case -1:  
                break;
            default:
                printf("Help will be printed very soon -:)\n");
        }
    }
}

Когда я запускаю свою программу, я получаю странный вывод:

./Server -p 80
Option p, or --port.
the port is 80

./Server -po 80
Option p, or --port.
the port is o

./Server -por 80
Option p, or --port.
the port is or

./Server -hoho
Option h, or --help.
Server: invalid option -- o
I don't understand this option!!!

1 Ответ

7 голосов
/ 21 сентября 2011

Я думаю, что путаница проистекает из недопонимания того, что долго выбирают.По сути, он будет выполнять частичное совпадение строк только при использовании формы --.Когда вы используете только -, он возвращается к стандартному синтаксическому анализу, поэтому -por 80 соответствует -p or 80 (как, например, опция -p и аргумент or).Попробуйте то же самое с --po и --por.Что касается помощи, попробуйте --he или --hel

...