C - параметры командной строки чтения

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

Ответы

Ответ 1

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

  • 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 по умолчанию.

[[email protected] c_code]$ gcc -std=c99 args.c

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

[[email protected] 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

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

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

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

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

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

Ответ 3

#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;
}