Я сделал небольшую программу для вычисления PI как интеграла. Теперь я столкнулся с вопросом, как его расширить, чтобы вычислить интеграл, который будет задан как дополнительный параметр при запуске и приложении. Кто-нибудь знает, как бороться с таким параметром в программе? Благодаря
C - параметры командной строки чтения
Ответ 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;
}
Ответ 4
Также есть встроенная библиотека C Standard для получения аргументов командной строки: getopt
Вы можете проверить его на https://en.wikipedia.org/wiki/Getopt или Аргумент-синтаксический анализ для C/UNIX