खोज…


वाक्य - विन्यास

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

पैरामीटर

पैरामीटर विवरण
argc तर्क गणना - प्रोग्राम-लाइन से प्रोग्राम-नाम के साथ-साथ प्रोग्राम को दिए गए स्थान-अलग-अलग तर्कों की संख्या के लिए प्रारंभिक।
argv लॉजिक वेक्टर - कमांड-लाइन पर दिए गए तर्कों (और प्रोग्राम का नाम) वाले char पॉइंटर्स (स्ट्रिंग्स) की एक सरणी के लिए आरंभिक।

टिप्पणियों

एक 'होस्टेड वातावरण' में चलने वाला एसी प्रोग्राम (सामान्य प्रकार - जैसा कि 'फ्रीस्टैंडिंग एनवायरनमेंट' के विपरीत) का main कार्य होना चाहिए। इसे पारंपरिक रूप से परिभाषित किया गया है:

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

ध्यान दें कि argv भी हो सकता है, और बहुत बार है, char **argv रूप में परिभाषित किया गया है; व्यवहार वही है। इसके अलावा, पैरामीटर नाम बदले जा सकते हैं क्योंकि वे फ़ंक्शन के भीतर सिर्फ स्थानीय चर हैं, लेकिन argc और argv पारंपरिक हैं और आपको उन नामों का उपयोग करना चाहिए।

main कार्यों के लिए जहां कोड किसी भी तर्क का उपयोग नहीं करता है, int main(void) उपयोग करें।

कार्यक्रम शुरू होने पर दोनों मापदंडों को आरंभ किया जाता है:

  • argc को प्रोग्राम-लाइन के साथ-साथ प्रोग्राम के नाम के लिए दिए गए स्थान-अलग-अलग तर्कों की संख्या के साथ आरंभ किया जाता है।
  • argv की एक सरणी है char -pointers (तार) तर्क (और इस कार्यक्रम का नाम) है कि कमांड लाइन पर दिया गया था युक्त।
  • कुछ सिस्टम कमांड-लाइन तर्क "शेल में" का विस्तार करते हैं, अन्य नहीं करते हैं। यूनिक्स पर अगर उपयोगकर्ता टाइप करता है myprogram *.txt प्रोग्राम को पाठ फ़ाइलों की एक सूची प्राप्त होगी; विंडोज पर यह स्ट्रिंग " *.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" को इंगित करता है "abba"
  • argv[2] "banana" को इंगित करता है,
  • argv[3] "mamajam"
  • argv[4] में NULL का मान होता NULL

मानक से पूर्ण उद्धरण के लिए सी और सी ++ में main() वापसी क्या होनी चाहिए, यह भी देखें।

कमांड लाइन तर्क मुद्रित करना

तर्क प्राप्त करने के बाद, आप उन्हें निम्नानुसार मुद्रित कर सकते हैं:

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. प्रिंट स्टेटमेंट में, आप 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 टूल्स का उपयोग करना

अनुप्रयोगों के लिए कमांड-लाइन विकल्पों को सी भाषा द्वारा कमांड-लाइन तर्कों से अलग तरीके से व्यवहार नहीं किया जाता है। वे केवल तर्क हैं, जो लिनक्स या यूनिक्स वातावरण में, पारंपरिक रूप से डैश ( - ) के साथ शुरू होते हैं।

लिनक्स या यूनिक्स वातावरण में glibc के साथ आप अपने बाकी तर्कों से कमांड-लाइन विकल्पों को आसानी से परिभाषित, सत्यापित और पार्स करने के लिए गेटटॉप टूल का उपयोग कर सकते हैं।

ये उपकरण उम्मीद करते हैं कि आपके विकल्प GNU कोडिंग मानकों के अनुसार प्रारूपित किए जाएंगे, जो कि कमांड लाइन विकल्पों के प्रारूप के लिए POSIX क्या निर्दिष्ट करता है, इसका एक विस्तार है।

नीचे दिया गया उदाहरण GNU गेटटॉप टूल के साथ कमांड-लाइन विकल्पों को संभालने का प्रदर्शन करता है।

#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 )। "फ़ाइल" और "संदेश" विकल्प दोनों तर्क स्वीकार करते हैं। यदि आप "संदेश" विकल्प निर्दिष्ट करते हैं, तो इसके तर्क की आवश्यकता है।

विकल्पों के लिए तर्क निम्नानुसार हैं:

  • --option=value (लंबे समय के विकल्प के लिए)
  • -ovalue या -o"value" (शॉर्ट-फॉर्म विकल्पों के लिए)


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow