getopt, дающий -1 в качестве возвращаемого значения

#c #getopt

#c #getopt

Вопрос:

Я пытаюсь понять, как работают getopts. Я написал приведенный ниже код, но не уверен, что я делаю неправильно. Пожалуйста, укажите мне :

 #include<unistd.h>
.. 
..
int main( int argc, char *argv[])
{
  int ch=0;
   while((ch=getopt(argc, argv, "ltR:")!=-1) // 0 here was by mistake. Changed to -1
    {  
      printf("%d",ch); //This prints -1 
       switch(ch)
               {
                 case 'l':
                 printf("l");
                 break;
                 case 't':
                 printf("t");
                 break;
                 case 'R':
                 printf("R");
                 break;
                }
    }
   return 0;
 }

 $ ./a.out -ltR 
 $ -1
 $ ./a.out -l 
 $ -1
  

Может быть, я действительно совершаю ошибку или упускаю какой-то аспект моего понимания getopt.

Внес изменения, но все равно дает тот же результат: (

Спасибо, Файзан

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

1. В этом коде также есть проблема со скобками в цикле while. Можете ли вы вставить свой фактический фрагмент кода, потому что он а) не компилируется и б) может дать ключ к вашей реальной проблеме.

2. о .. это на другой машине, на которой у меня нет доступа в Интернет.. вот почему пришлось вводить .. сравнивая оба, но не замечая никакой разницы в циклах while.. проверка еще раз

Ответ №1:

Я думаю, что ваше выражение while должно быть

 while((ch=getopt(argc, argv, "ltR")!=-1)
{..}
  

и опция должна заканчиваться ‘:’

 while((ch=getopt(argc, argv, "ltR:")!=-1)
{..}
  

или два ‘:’, если переключатель необязателен.

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

1. Это 0 было по ошибке. Первоначально у меня было -1, но при вводе здесь я сделал его 0. Также добавлен «ltR:», но дает те же результаты

Ответ №2:

На странице руководства -1 указывает, что все аргументы были выполнены, а не 0, как вы, похоже, проверяете.

 man 3 getopt
  

Если опция была успешно найдена, то getopt() возвращает символ опции. Если все параметры командной строки были проанализированы, то getopt() возвращает -1.

Код в вашем вопросе не анализируется из коробки, поэтому он не выглядит как правильная вставка копирования, что значительно затрудняет обнаружение ошибки. Скобки в цикле while могут быть причиной вашей проблемы, но трудно сказать. Если я скопирую ваш пример и исправлю проблему со скобками, код будет работать так, как вы ожидаете.

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

1. Если я передаю аргументы, то это не должно быть -1, верно? запуск его как ./a.out -l, но все равно выдает -1

2. Правильно Colin..it здесь была ошибка копирования, и в самой программе тоже была ошибка. Исправил скобки, и это сработало. Спасибо