C - чтение параметров командной строки - PullRequest
17 голосов
/ 01 марта 2011

Я сделал небольшую программу для вычисления pi (π) как интеграла. Теперь я сталкиваюсь с вопросом, как расширить его для вычисления интеграла, который будет задан в качестве дополнительного параметра при запуске приложения. Как мне работать с таким параметром в программе?

Ответы [ 4 ]

45 голосов
/ 01 марта 2011

Когда вы пишете свою основную функцию, вы обычно видите одно из двух определений:

  • int main(void)
  • int main(int argc, char **argv)

ВтороеФорма позволит вам получить доступ к аргументам командной строки, переданным программе, и указанному количеству аргументов (аргументы разделены пробелами).

Аргументы main:

  • int argc - количество аргументов, переданных в вашу программу при запуске.Это как минимум 1.
  • char **argv - это указатель на char *.В качестве альтернативы это может быть: char *argv[], что означает «массив из char *».Это массив строковых указателей в стиле C.

Базовый пример

Например, вы можете сделать это, чтобы распечатать аргументы, передаваемые вашей C-программе:

#include <stdio.h>

int main(int argc, char **argv)
{
    for (int i = 0; i < argc; ++i)
    {
        printf("argv[%d]: %s\n", i, argv[i]);
    }
}

Я использую GCC 4.5 для компиляции файла, который я назвал args.c.Он скомпилирует и создаст a.out исполняемый файл по умолчанию.

[birryree@lilun c_code]$ gcc -std=c99 args.c

Теперь запустите его ...

[birryree@lilun c_code]$ ./a.out hello there
argv[0]: ./a.out
argv[1]: hello
argv[2]: there

Так что вы можете видеть это в argv, argv[0]это имя программы, которую вы запустили (это не стандартное поведение, но оно распространено. Ваши аргументы начинаются с argv[1] и далее.

Так что, в принципе, если вы хотите один параметр, вы можете сказать,...

./myprogram integral


Простой случай для вас

И вы можете проверить, было ли argv[1] integral, возможно, как strcmp("integral", argv[1]) == 0.

Итак, в вашем коде ...

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
    if (argc < 2) // no arguments were passed
    {
        // do something
    }

    if (strcmp("integral", argv[1]) == 0)
    {
        runIntegral(...); //or something
    }
    else
    {
        // do something else.
    }
}

Улучшенный синтаксический анализ командной строки

Конечно, все это было очень элементарно, и по мере того, как ваша программа получаетболее сложный, вы, вероятно, захотите более продвинутую обработку командной строки. Для этого вы можете использовать библиотеку типа GNU getopt.

2 голосов
/ 13 декабря 2013

Разбор аргументов командной строки примитивным способом, как объяснено в ответах выше, является разумным, если число параметров, с которыми вам нужно иметь дело, не слишком много.

Я настоятельно рекомендую вам использовать промышленную библиотеку для обработки аргументов командной строки.

Это сделает ваш код более профессиональным.

Такая библиотека для C ++ доступна на следующем веб-сайте. Я использовал эту библиотеку во многих своих проектах, поэтому могу с уверенностью сказать, что это одна из самых простых, но полезных библиотек для разбора аргументов командной строки. Кроме того, поскольку это просто библиотека шаблонов, ее проще импортировать в ваш проект. http://tclap.sourceforge.net/

Аналогичная библиотека доступна и для языка Си. http://argtable.sourceforge.net/

2 голосов
/ 01 марта 2011
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
  int i, parameter = 0;
  if (argc >= 2) {
    /* there is 1 parameter (or more) in the command line used */
    /* argv[0] may point to the program name */
    /* argv[1] points to the 1st parameter */
    /* argv[argc] is NULL */
    parameter = atoi(argv[1]); /* better to use strtol */
    if (parameter > 0) {
      for (i = 0; i < parameter; i++) printf("%d ", i);
    } else {
      fprintf(stderr, "Please use a positive integer.\n");
    }
  }
  return 0;
}
1 голос
/ 24 января 2017

Существует также стандартная встроенная библиотека C для получения аргументов командной строки: getopt

Вы можете проверить это в Википедии или в Помощники синтаксического анализа аргументов для C / Unix .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...