Проблемы с пониманием указателей на аргументы командной строки - PullRequest
0 голосов
/ 07 февраля 2011

Мой профессор привел этот пример в классе. Это в основном версия команды Unix more, и я не уверен насчет пары вещей в ней

int main( int ac , char *av[] )
{
  FILE  *fp;

  if ( ac == 1 )
    do_more( stdin );
  else
    while ( --ac )
     if ( (fp = fopen( *++av , "r" )) != NULL )
     {
        do_more( fp ) ; 
        fclose( fp );
     }
     else
        exit(1);
return 0;
}

Я понимаю, что *fp определяет указатель файла, а * av [] - массив аргументов командной строки. Но что означает *++av с точки зрения эксплуатации?

Ответы [ 2 ]

8 голосов
/ 07 февраля 2011

читать * ++ av следующим образом:

++av // increment the pointer
*av // get the value at the pointer, which will be a char*

в этом примере будут открываться все файлы, переданные в командной строке.

также:

av[0] // program name
av[1] // parameter 1
av[2] // parameter 2
av[3] // parameter 3
av[ac - 1] // last parameter
2 голосов
/ 07 февраля 2011

Вот лучшая версия кода, которая должна делать то же самое. Надеюсь, это будет легче понять. Имена argc и argv де-факто являются стандартными, их следует использовать, чтобы сделать код более понятным для других программистов.

int main (int argc, char *argv[])
{
  FILE *fp;
  int i;

  if ( argc == 1 )
  {
    do_more( stdin );
  }
  else
  {
    for(i=1; i<argc; i++) /* skip the name of the executable, start at 1 */
    {
      fp = fopen (argv[i], "r");
      if(fp == NULL)
      {
        /* error message, return etc here */
      }

      do_more( fp ) ;
      fclose( fp );
    }
  }

  return 0;
}
...