Я использовал параметры командной строки для чтения 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 %s\n", optarg, optarg);
break;
case 'v':
printf("viewonly is set\n");
break;
case 'h':
case '?':
default:
fprintf(stderr, "error\n");
exit(EXIT_FAILURE);
}
}
return 0;
}
и я использую эту опцию командной строки: ./a.out --password --viewonly
, Он должен напечатать сообщение об ошибке, --password
отсутствует аргумент, но getopt_long
никогда не возвращать ‘?’, но лечить --viewonly
как optarg
из --password
, и вывод:
optarg: 24992bc4 --viewonly
Я думаю, что это странно, и что я должен сделать, чтобы getopt_long рассматривал имя опции как аргумент?
У меня будет некоторая проверка ошибок в моем операторе switch (может быть, проверка того, что пароль не может начинаться с ‘-‘)