Поиск…


Синтаксис

  • 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]); 
    }
}

Заметки

  1. Параметр argv может быть определен как char *argv[] .
  2. argv[0] может содержать имя самой программы (в зависимости от того, как была выполнена программа). Первый «реальный» аргумент командной строки находится в argv[1] , и именно поэтому переменная цикла i инициализируется 1.
  3. В заявлении print вы можете использовать *(argv + i) вместо argv[i] - он оценивает одно и то же, но более подробен.
  4. Квадратные скобки вокруг значения аргумента помогают идентифицировать начало и конец. Это может быть неоценимо, если в аргументе есть завершающие пробелы, символы новой строки, возврат каретки или другие нечетные символы. Некоторые варианты этой программы являются полезным инструментом для отладки сценариев оболочки, где вам нужно понять, что на самом деле содержит список аргументов (хотя есть простые альтернативы оболочки, которые почти эквивалентны).

Печать аргументов в программу и преобразование в целые значения

Следующий код будет печатать аргументы в программе, и код попытается преобразовать каждый аргумент в число (до 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" (для вариантов короткой формы)


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow