Я хотел использовать getopt() для анализа аргументов, предоставленных в командной строке, но у меня возникли проблемы с очень простыми тестовыми примерами. У меня есть следующий код (который почти, но не полностью идентичен коду, предоставленному в качестве примера в Стандартное определение POSIX).
int main(int argc, char *argv[]) {
int c;
int rmsflg = 0, saflg = 0, errflg = 0;
char *ifile;
char *ofile;
//Parse command line arguments using getopt
while (((c=getopt(argc,argv, ":i:rso:")) != 1) && (errflg == 0)) {
switch(c){
case 'i':
ifile="optarg";
break;
case 'o':
ofile="optarg";
break;
case 'r':
if (saflg)
errflg++;
else {
rmsflg++;
printf("Root Mean Square averaging selected\n");
}
break;
case 's':
if (rmsflg)
errflg++;
else {
saflg++;
printf("Standard Arithmetic averaging selected\n");
}
break;
case ':':
fprintf(stderr,"Option -%c requires an argument\n",optopt);
errflg++;
break;
case '?':
fprintf(stderr,"Option -%c is not a valid option\n",optopt);
errflg++;
break;
default:
fprintf(stderr,"The value of c is %c,\
the option that caused this error is -%c\n",c,optopt);
errflg++;
break;
}
}
if (errflg) {
fprintf(stderr, "usage: xxx\n");
exit(2);
}
return 0;
}
Во-первых, когда у меня нет регистра по умолчанию, ничего не выводится. Когда я вставил регистр по умолчанию и заставил его выводить значение, которое имеет c
, я получаю ?
. Это странно по 2 причинам. Во-первых, и это меня больше всего беспокоит, почему c
не совпадает с регистром ?
, который был специально написан для соответствия этому выводу, а скорее переходит к регистру default
. Во-вторых, вывод optopt
(для моего ввода) o
. Символ ?
возвращается только в том случае, если указанный параметр не соответствует ни одному символу в optstring.
getopt()
, выполняемого с обработкой arg, о которой Эмануэле Паолини упоминает в своем ответе. Допустимые параметры обрабатываются так, как вы ожидаете (с предложениемdefault:
или без него. Если добавлено предложениеdefault:
, программа выполняет его после завершения обработки аргументов (и, следовательно, не зависает). - person Michael Burr   schedule 02.01.2014getopt()
возвращал-1
, не было совпадения регистра (до добавления предложенияdefault:
), поэтому ничего не выводилось. Программа будет бесконечно зацикливаться, аgetopt()
всегда будет возвращать-1
. Когда вы добавляете предложениеdefault:
, там перехватывается результат-1
. Я предполагаю, что вывод-1
со спецификацией формата%c
отображается OSX как '?' поскольку -1 не соответствует символу кодовой страницы или шрифта. Теперь вы запутались - похоже, чтоgetopt()
вернул '?'. Попробуйте:printf("-1 as char: %c\n", -1);
- person Michael Burr   schedule 02.01.2014