Zoeken…


Syntaxis

  • int main (int argc, char * argv [])

parameters

Parameter Details
argc aantal argumenten - geïnitialiseerd naar het aantal door spaties gescheiden argumenten die aan het programma zijn gegeven vanaf de opdrachtregel en de programmanaam zelf.
argv argumentvector - geïnitialiseerd naar een array van char pointers (tekenreeksen) met de argumenten (en de programmanaam) die op de opdrachtregel zijn opgegeven.

Opmerkingen

Een AC-programma dat wordt uitgevoerd in een 'gehoste omgeving' (het normale type - in tegenstelling tot een 'vrijstaande omgeving') moet een main hebben. Het wordt traditioneel gedefinieerd als:

int main(int argc, char *argv[])

Merk op dat argv ook kan worden, en heel vaak, wordt gedefinieerd als char **argv ; het gedrag is hetzelfde. Ook kunnen de parameternamen worden gewijzigd omdat het slechts lokale variabelen binnen de functie zijn, maar argc en argv zijn conventioneel en u moet deze namen gebruiken.

Voor main functies waar de code geen argumenten niet gebruikt, gebruik int main(void) .

Beide parameters worden geïnitialiseerd wanneer het programma start:

  • argc wordt geïnitialiseerd op basis van het aantal spatie-gescheiden argumenten dat aan het programma wordt gegeven vanaf de opdrachtregel en de programmanaam zelf.
  • argv is een array van char (tekenreeksen) met de argumenten (en de programmanaam) die op de opdrachtregel zijn opgegeven.
  • sommige systemen breiden opdrachtregelargumenten "in de shell" uit, andere niet. Als bij Unix de gebruiker myprogram *.txt typt, myprogram *.txt het programma een lijst met tekstbestanden; in Windows ontvangt het de tekenreeks " *.txt ".

Opmerking: voordat u argv , moet u mogelijk de waarde van argc . In theorie zou argc 0 kunnen zijn, en als argc nul is, dan zijn er geen argumenten en is argv[0] (equivalent aan argv[argc] ) een nulwijzer. Het zou een ongebruikelijk systeem zijn met een gehoste omgeving als u dit probleem tegenkomt. Evenzo is het mogelijk, hoewel zeer ongebruikelijk, dat er geen informatie is over de programmanaam. In dat geval is argv[0][0] == '\0' - de programmanaam is mogelijk leeg.

Stel dat we het programma als volgt starten:

./some_program abba banana mamajam

Dan is argc gelijk aan 4 en de opdrachtregelargumenten:

  • argv[0] "./some_program" naar "./some_program" (de programmanaam) als de programmanaam beschikbaar is in de "./some_program" . Anders een lege string "" .
  • argv[1] verwijst naar "abba" ,
  • argv[2] verwijst naar "banana" ,
  • argv[3] "mamajam" naar "mamajam" ,
  • argv[4] bevat de waarde NULL .

Zie ook Wat moet main() retourneren in C en C ++ voor volledige citaten uit de standaard.

De opdrachtregelargumenten afdrukken

Na ontvangst van de argumenten kunt u ze als volgt afdrukken:

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

Notes

  1. De parameter argv kan ook worden gedefinieerd als char *argv[] .
  2. argv[0] kan de programmanaam zelf bevatten (afhankelijk van hoe het programma werd uitgevoerd). Het eerste "echte" opdrachtregelargument staat op argv[1] , en dit is de reden waarom de lusvariabele i wordt geïnitialiseerd op 1.
  3. In de print-instructie kunt u *(argv + i) plaats van argv[i] - het evalueert hetzelfde, maar is uitgebreider.
  4. De vierkante haken rond de argumentwaarde helpen bij het identificeren van het begin en einde. Dit kan van onschatbare waarde zijn als er achterliggende spaties, nieuwe regels, regelterugloop of andere vreemde tekens in het argument voorkomen. Een variant op dit programma is een handig hulpmiddel voor het debuggen van shell-scripts waarbij u moet weten wat de argumentlijst eigenlijk bevat (hoewel er eenvoudige shell-alternatieven zijn die bijna equivalent zijn).

Druk de argumenten af naar een programma en converteer naar gehele getallen

De volgende code drukt de argumenten naar het programma af en de code probeert elk argument in een getal om te zetten (naar een long nummer):

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

Referenties:

Getoptools van GNU gebruiken

Opdrachtregelopties voor toepassingen worden door de C-taal niet anders behandeld dan opdrachtregelargumenten. Het zijn slechts argumenten die in een Linux- of Unix-omgeving traditioneel beginnen met een streepje ( - ).

Met glibc in een Linux- of Unix-omgeving kunt u de getopt-tools gebruiken om eenvoudig opdrachtregelopties te definiëren, valideren en ontleden uit de rest van uw argumenten.

Deze tools verwachten dat uw opties worden opgemaakt volgens de GNU-coderingsstandaarden , een uitbreiding van wat POSIX opgeeft voor het formaat van opdrachtregelopties.

Het onderstaande voorbeeld laat zien hoe opdrachtregelopties kunnen worden verwerkt met de GNU getopt-tools.

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

Het kan worden gecompileerd met gcc :

gcc example.c -o example

Het ondersteunt drie opdrachtregelopties ( --help , --file en --msg ). Alle hebben ook een "korte vorm" ( -h , -f en -m ). De opties "bestand" en "msg" accepteren beide argumenten. Als u de optie "msg" opgeeft, is het argument vereist.

Argumenten voor opties worden opgemaakt als:

  • --option=value (voor lange- --option=value )
  • -ovalue of -o"value" (voor korte formulieropties)


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow