Я только что занимался этой проблемой, и, похоже, на этот вопрос никогда не было полного ответа.
Вы должны убедиться, что устанавливаете внешнюю переменную libc opterr = 0
, прежде чем вызывать getopt
; если вы не сбрасываете его и getopt
ранее имела ошибку в другом приложении в вашей системе, которое его использовало, он не будет работать для аргумента. Я также повторю существующую точку зрения, что, поскольку у вас нет оператора break после case 'X':
, это верный признак проблемы, поскольку он не пройдет.
getopt
обрабатывает только один аргумент за раз, поэтому попадание из случая X
в случай f
— плохой поступок. У вас всегда должен быть разрыв в каждом операторе case switch
, если вы не абсолютно уверены, что он провалится (что, по моему опыту, очень редко). В качестве еще одной общей хорошей практики вы должны всегда заключать блоки кода в { } (ссылаясь на ваше условное выражение), если только это не оператор return
или break
или что-то еще, что приводит к тому, что поток программы выпадает из текущей или родительской области блока или для входа в новую область через вызов функции или метода.
Я думаю, что ваша строка опций Xf:eE:dD в порядке. Это указывает на то, что:
1) Далее будут просто флаги опций, которые всегда имеют нулевой аргумент: XedD
2) Для следующих опций потребуется аргумент: fE
Если это та функциональность, которую вы ищете, данная строка опций в порядке. Если вы используете GNU libc, в соответствии с другим приведенным выше ответом вы можете использовать :: после параметра в строке параметра, чтобы указать, что параметр может иметь аргумент, но не обязательно.
Итак, в верхней части файла убедитесь, что у вас есть как минимум:
extern int opterr;
Затем прямо перед тем, как вы вызовете getopt
в первый раз в своем коде, установите opterr
в 0.
e.g.
opterr = 0;
while ((opt = getopt(argc, argv, "Xf:eE:dD")) != EOF) {
switch (opt) {
case 'X':
case 'f':
if (optarg == NULL)
fput("no point of living", fp); << for debugging
Это должно хотя бы частично решить вашу проблему. Вот ссылка на пример:
http://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html
Ваше здоровье,
Джон
person
jhyry
schedule
20.06.2014
-X
или для-f
? - person mu is too short   schedule 23.06.2011-f
, а не просто провал из-X
? - person mu is too short   schedule 23.06.2011-X
, поставьтеbreak
сразу послеcase
. - person mu is too short   schedule 24.06.2011