getopt_long обрабатывает имя параметра как аргумент

#c #c #linux #getopt #getopt-long

#c #c #linux #getopt #getopt-long

Вопрос:

Я использовал getopt_long для чтения параметров командной строки. код:

 #include <getopt.h>
#include <stdlib.h>
#include <stdio.h>
int
main(int argc, char *argv[])
{
    int ch;
    struct option longopts[] = {
        {"password", required_argument, NULL, 'p'},
        {"viewonly", no_argument, NULL, 'v'},
        {"help", no_argument, NULL, 'h'},
        {NULL, 0, NULL, 0}
    };
    while ((ch = getopt_long(argc, argv, "p:vh", longopts, NULL)) != -1) {
        switch (ch) {
        case 'p':
            printf("optarg: %x %sn", optarg, optarg);
            break;
        case 'v':
            printf("viewonly is setn");
            break;
        case 'h':
        case '?':
        default:
            fprintf(stderr, "errorn");
            exit(EXIT_FAILURE);
        }
    }
    return 0;
}
 

и я использую эту опцию командной строки: ./a.out --password --viewonly , Предполагается, что она выводит сообщение об ошибке, в котором --password отсутствует аргумент, но getopt_long никогда не возвращает ‘?’, а обрабатывает --viewonly как optarg of --password . и вывод:

 optarg: 24992bc4 --viewonly
 

Я думаю, это странно, и что я должен сделать, чтобы запретить getopt_long обрабатывать имя параметра как аргумент?

Комментарии:

1. Ты не можешь. Вместо этого вы должны обнаружить проблему позже в коде, например, при проверке пароля, а затем сообщить пользователю, что пользователь ввел неправильный пароль.

2. но это также скрывает viewonly опцию от чтения. Может ли это быть исправлено вручную?

3. Если пользователь введет неправильный пароль, сможете ли вы вообще зайти достаточно далеко в программе, чтобы использовать этот viewonly параметр? Пользователь вводит неправильный пароль (или он «отсутствует», как в вашем случае), это должно быть довольно фатальной ошибкой, что означает, что пользователь повторно запустит вашу программу с (надеюсь, правильным) паролем, и проблема отчасти спорная. Ваша проблема — это только проблема в небольшой тестовой программе, подобной приведенной здесь.

4. Если вы используете C , попробуйте вместо этого увеличить параметры программы.

5. это прямо здесь. но я думаю, что есть и другие условия, которые следует учитывать. и почему getopt_long не определил, начинается ли optarg с ‘-‘ или ‘-‘ и возвращает ‘?’ ?

Ответ №1:

У меня была бы некоторая проверка ошибок в моем операторе switch (возможно, проверьте, что пароль не может начинаться с ‘—‘).