C Language
Аргументы командной строки
Поиск…
Синтаксис
- int main (int argc, char * argv [])
параметры
параметр | подробности |
---|---|
ARGC | аргумент count - инициализируется количеством аргументов, разделенных пробелами, заданных программе из командной строки, а также самого имени программы. |
ARGV | вектор-аргумент - инициализируется массивом char указателей (строк), содержащих аргументы (и имя программы), которые были указаны в командной строке. |
замечания
Программа AC, работающая в «размещенной среде» (нормальный тип - в отличие от «автономной среды») должна иметь main
функцию. Это традиционно определяется как:
int main(int argc, char *argv[])
Обратите внимание, что argv
также может быть и очень часто определяется как char **argv
; поведение такое же. Кроме того, имена параметров могут быть изменены, поскольку они являются только локальными переменными внутри функции, но argc
и argv
являются обычными, и вы должны использовать эти имена.
Для main
функций, где код не использует никаких аргументов, используйте int main(void)
.
Оба параметра инициализируются при запуске программы:
-
argc
инициализируется количеством аргументов, разделенных пробелом, заданных программе из командной строки, а также самого имени программы. -
argv
- это массивchar
указателей (строк), содержащих аргументы (и имя программы), которые были указаны в командной строке. - некоторые системы расширяют аргументы командной строки «в оболочке», другие - нет. В Unix, если пользователь вводит
myprogram *.txt
программа получит список текстовых файлов; в Windows он получит строку «*.txt
».
Примечание. Перед использованием argv
вам может потребоваться проверить значение argc
. Теоретически argc
может быть 0
, а если argc
равно нулю, то аргументов нет, а argv[0]
(эквивалентный argv[argc]
) является нулевым указателем. Если бы вы столкнулись с этой проблемой, это была бы необычная система с размещенной средой. Точно так же возможно, хотя и очень необычно, чтобы не было никакой информации о названии программы. В этом случае argv[0][0] == '\0'
- имя программы может быть пустым.
Предположим, что мы запускаем программу следующим образом:
./some_program abba banana mamajam
Тогда argc
равен 4
, а аргументы командной строки:
-
argv[0]
указывает на"./some_program"
(имя программы), если имя программы доступно из среды хоста. Иначе пустая строка""
. -
argv[1]
указывает на"abba"
, -
argv[2]
указывает на"banana"
, -
argv[3]
указывает на"mamajam"
, -
argv[4]
содержит значениеNULL
.
См. Также Что должно main()
возвращать в C и C ++ для полных кавычек из стандарта.
Печать аргументов командной строки
После получения аргументов вы можете распечатать их следующим образом:
int main(int argc, char **argv)
{
for (int i = 1; i < argc; i++)
{
printf("Argument %d: [%s]\n", i, argv[i]);
}
}
Заметки
- Параметр
argv
может быть определен какchar *argv[]
. -
argv[0]
может содержать имя самой программы (в зависимости от того, как была выполнена программа). Первый «реальный» аргумент командной строки находится вargv[1]
, и именно поэтому переменная циклаi
инициализируется 1. - В заявлении print вы можете использовать
*(argv + i)
вместоargv[i]
- он оценивает одно и то же, но более подробен. - Квадратные скобки вокруг значения аргумента помогают идентифицировать начало и конец. Это может быть неоценимо, если в аргументе есть завершающие пробелы, символы новой строки, возврат каретки или другие нечетные символы. Некоторые варианты этой программы являются полезным инструментом для отладки сценариев оболочки, где вам нужно понять, что на самом деле содержит список аргументов (хотя есть простые альтернативы оболочки, которые почти эквивалентны).
Печать аргументов в программу и преобразование в целые значения
Следующий код будет печатать аргументы в программе, и код попытается преобразовать каждый аргумент в число (до long
):
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <limits.h>
int main(int argc, char* argv[]) {
for (int i = 1; i < argc; i++) {
printf("Argument %d is: %s\n", i, argv[i]);
errno = 0;
char *p;
long argument_numValue = strtol(argv[i], &p, 10);
if (p == argv[i]) {
fprintf(stderr, "Argument %d is not a number.\n", i);
}
else if ((argument_numValue == LONG_MIN || argument_numValue == LONG_MAX) && errno == ERANGE) {
fprintf(stderr, "Argument %d is out of range.\n", i);
}
else {
printf("Argument %d is a number, and the value is: %ld\n",
i, argument_numValue);
}
}
return 0;
}
РЕКОМЕНДАЦИИ:
Использование инструментов GNU getopt
Параметры командной строки для приложений не обрабатываются иначе, чем аргументы командной строки на языке C. Это просто аргументы, которые в среде Linux или Unix традиционно начинаются с тире ( -
).
С glibc в среде Linux или Unix вы можете использовать инструменты getopt, чтобы легко определять, проверять и анализировать параметры командной строки из остальных ваших аргументов.
Эти инструменты ожидают, что ваши параметры будут отформатированы в соответствии со стандартами кодирования GNU , что является расширением того, что POSIX задает для формата параметров командной строки.
В приведенном ниже примере демонстрируется обработка параметров командной строки с помощью инструментов GNU getopt.
#include <stdio.h>
#include <getopt.h>
#include <string.h>
/* print a description of all supported options */
void usage (FILE *fp, const char *path)
{
/* take only the last portion of the path */
const char *basename = strrchr(path, '/');
basename = basename ? basename + 1 : path;
fprintf (fp, "usage: %s [OPTION]\n", basename);
fprintf (fp, " -h, --help\t\t"
"Print this help and exit.\n");
fprintf (fp, " -f, --file[=FILENAME]\t"
"Write all output to a file (defaults to out.txt).\n");
fprintf (fp, " -m, --msg=STRING\t"
"Output a particular message rather than 'Hello world'.\n");
}
/* parse command-line options and print message */
int main(int argc, char *argv[])
{
/* for code brevity this example just uses fixed buffer sizes for strings */
char filename[256] = { 0 };
char message[256] = "Hello world";
FILE *fp;
int help_flag = 0;
int opt;
/* table of all supported options in their long form.
* fields: name, has_arg, flag, val
* `has_arg` specifies whether the associated long-form option can (or, in
* some cases, must) have an argument. the valid values for `has_arg` are
* `no_argument`, `optional_argument`, and `required_argument`.
* if `flag` points to a variable, then the variable will be given a value
* of `val` when the associated long-form option is present at the command
* line.
* if `flag` is NULL, then `val` is returned by `getopt_long` (see below)
* when the associated long-form option is found amongst the command-line
* arguments.
*/
struct option longopts[] = {
{ "help", no_argument, &help_flag, 1 },
{ "file", optional_argument, NULL, 'f' },
{ "msg", required_argument, NULL, 'm' },
{ 0 }
};
/* infinite loop, to be broken when we are done parsing options */
while (1) {
/* getopt_long supports GNU-style full-word "long" options in addition
* to the single-character "short" options which are supported by
* getopt.
* the third argument is a collection of supported short-form options.
* these do not necessarily have to correlate to the long-form options.
* one colon after an option indicates that it has an argument, two
* indicates that the argument is optional. order is unimportant.
*/
opt = getopt_long (argc, argv, "hf::m:", longopts, 0);
if (opt == -1) {
/* a return value of -1 indicates that there are no more options */
break;
}
switch (opt) {
case 'h':
/* the help_flag and value are specified in the longopts table,
* which means that when the --help option is specified (in its long
* form), the help_flag variable will be automatically set.
* however, the parser for short-form options does not support the
* automatic setting of flags, so we still need this code to set the
* help_flag manually when the -h option is specified.
*/
help_flag = 1;
break;
case 'f':
/* optarg is a global variable in getopt.h. it contains the argument
* for this option. it is null if there was no argument.
*/
printf ("outarg: '%s'\n", optarg);
strncpy (filename, optarg ? optarg : "out.txt", sizeof (filename));
/* strncpy does not fully guarantee null-termination */
filename[sizeof (filename) - 1] = '\0';
break;
case 'm':
/* since the argument for this option is required, getopt guarantees
* that aptarg is non-null.
*/
strncpy (message, optarg, sizeof (message));
message[sizeof (message) - 1] = '\0';
break;
case '?':
/* a return value of '?' indicates that an option was malformed.
* this could mean that an unrecognized option was given, or that an
* option which requires an argument did not include an argument.
*/
usage (stderr, argv[0]);
return 1;
default:
break;
}
}
if (help_flag) {
usage (stdout, argv[0]);
return 0;
}
if (filename[0]) {
fp = fopen (filename, "w");
} else {
fp = stdout;
}
if (!fp) {
fprintf(stderr, "Failed to open file.\n");
return 1;
}
fprintf (fp, "%s\n", message);
fclose (fp);
return 0;
}
Он может быть скомпилирован с помощью gcc
:
gcc example.c -o example
Он поддерживает три параметра командной строки ( --help
, --file
и --msg
). У всех также есть «короткая форма» ( -h
, -f
и -m
). Опции «file» и «msg» принимают аргументы. Если вы укажете опцию «msg», ее аргумент необходим.
Аргументы для параметров форматируются как:
-
--option=value
(для вариантов длинной формы) -
-ovalue
или-o"value"
(для вариантов короткой формы)