Недавно я баловался с getopt
(из unistd.h). Я написал некоторый код, который отлично работал под Windows 7, скомпилированный с помощью gcc из MinGW, но не работал под Raspbian Linux на моем Raspberry Pi (я скомпилировал их оба с помощью gcc, без опций; gcc t.c
). По какой-то причине getopt возвращает int 255 или char ÿ при отсутствии переключателей, тогда как на самом деле он должен возвращать -1.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
char t;
opterr = 0;
while ((t = getopt(argc, argv, "a:")) != -1)
switch (t) {
case 'a':
printf("-a with argument %s\n", optarg);
return 0;
case '?':
printf("uknown option\n");
return 1;
default:
/* This is always 255 under linux, and is never reached under windows */
printf("getopt returned int %d (char %c)\n", t, t);
return 2;
}
return 0;
}
У меня была одна мысль, что на самом деле 255 равно -1 в неподписанной 8-битной арифметике, поэтому я попытался поместить приведение типа int в условное выражение while, но это ничего не дало.
char t;
наint t;
и все будет в порядке. (-1 будет означать EOF или, в данном случае: больше никаких опций. Вы можете справиться с этим, добавивcase -1: break;
) - person wildplasser   schedule 12.06.2013getopt
не возвращалEOF
со времен POSIX.2. Он возвращает -1, когда не может найти больше вариантов. - person Carl Norum   schedule 12.06.2013EOF
, и я просто хотел уточнить, что фактическая константаEOF
изstdio.h
не возвращаетсяgetopt
и не возвращается с 1992 года или около того. - person Carl Norum   schedule 12.06.2013sscanf
возвращает константуEOF
, не так ли? Это просто совпадение, чтоEOF
в большинстве систем равно-1
. Во всяком случае, это уточнение, которое я хотел сделать - между семантикой конца файла и буквальным использованиемEOF
в качестве константы. - person Carl Norum   schedule 13.06.2013