हमें argc की आवश्यकता क्यों है जबकि argv के अंत में हमेशा एक अशक्त रहता है?


117

ऐसा लगता है कि यह argv[argc]हमेशा होता है NULL, इसलिए मुझे लगता है कि हम बिना तर्क सूची को पार कर सकते हैं argc। एक एकल whileलूप यह करेगा।

अगर वहाँ हमेशा NULLके अंत में है argv, हम एक की आवश्यकता क्यों है argc?


17
यह शायद सुविधा की बात है। यदि लूपिंग के बिना पर्याप्त तर्क नहीं हैं, तो प्रोग्रामर को जल्दी से बाहर निकलने का आसान तरीका देता है। अन्यथा हम निश्चित रूप से कार्य int argc(char *argv[])कर रहे हैं, ठीक इसी तरह से :-))
cnicutar

5
बस स्पष्ट होना "\0"NULL पॉइंटर के समान नहीं है ( 0C ++ में NULL के बराबर है)
Mats Petersson

31
अगर हमारे पास argc है तो हमें argv [argc] को NULL क्यों होना चाहिए?
अंबोज़ बिज्जक

7
आप लगातार समय में तर्कों की संख्या कैसे निर्धारित करेंगे?
अवकर

4
मत सोचो कि लिनक्स / यूनिक्स टैग यहां उपयुक्त हैं, क्योंकि यह व्यवहार सभी ऑपरेटिंग सिस्टम के सभी कंपाइलरों के लिए सही होना चाहिए।
डारेल हॉफमैन

जवाबों:


106

हाँ, argv[argc]==NULLगारंटी है। C11 5.1.2.2.1 कार्यक्रम स्टार्टअप देखें (मेरा जोर)

यदि उन्हें घोषित किया जाता है, तो मुख्य कार्य के पैरामीटर निम्नलिखित बाधाओं का पालन करेंगे:

Argc का मूल्य nonnegative होगा। argv [argc] एक शून्य सूचक होगा।

argcइसलिए प्रदान करना महत्वपूर्ण नहीं है, लेकिन फिर भी उपयोगी है। अन्य बातों के अलावा, यह त्वरित जांच के लिए अनुमति देता है कि सही संख्या में तर्क पारित किए गए हैं।

संपादित करें: C ++ को शामिल करने के लिए प्रश्न में संशोधन किया गया है। n3337 मसौदा 3.6.1 मुख्य समारोह कहता है

2 ... argc उस प्रोग्राम के लिए पारित किए गए तर्कों की संख्या होगी जहाँ से प्रोग्राम चलाया जाता है। .... argc का मान ऋणात्मक नहीं होगा। Argv [argc] का मान 0 होगा


36
और argcकाफी बड़ा हो सकता है, क्योंकि खोल विस्तार कर रही है (ताकि में से पहले खोल से विस्तार किया जाता है के निष्पादन)। अपने सिस्टम पर, मैं कई सौ हजारों हो सकता है। ls **execve/bin/lsargc
बेसाइल स्टारीनेवविच

यह बहुत अच्छा है, यह मेरे लिए कभी नहीं हुआ क्योंकि मैंने हमेशा argcपर्याप्त माना , लेकिन मैं निश्चित रूप से उन स्थितियों के बारे में सोच सकता हूं जहां यह गारंटी प्रासंगिक होगी और यहां तक ​​कि आवश्यक भी होगी। +1
थॉमस

6
@BasileStarynkevitch केवल एक अतिरिक्त समय के लिए सूचक मूल्यों की एक सरणी के माध्यम से कदम रखने का समय NULL तक, गिनती प्राप्त करने के लिए, समय-समय पर सूचक सरणी उत्पन्न करने वाले समय की तुलना में न्यूनतम होता है, और वास्तव में कार्यक्रम में प्रत्येक तर्क मान का उपयोग करने की तुलना में अधिक अप्रासंगिक भी होता है। और अगर सिर्फ यह जांचना कि क्या तर्क संख्या एन से अधिक है, तो पूरे सरणी से गुजरने की आवश्यकता नहीं है। फिर भी, मैं पूरी तरह से सहमत हूं, argcयह एक अच्छी बात थी।
hyde

43

हाँ, argv[argc]एक शून्य सूचक होने की गारंटी है। argcसुविधा के लिए प्रयोग किया जाता है।

C99 Rationale से आधिकारिक स्पष्टीकरण का हवाला देते हुए, निरर्थक शब्दों पर ध्यान दें :

अंतर्राष्ट्रीय मानक के लिए तर्क - प्रोग्रामिंग भाषाएँ - C .25.1.2.2.1 कार्यक्रम स्टार्टअप

के विनिर्देश argcऔर argvतर्क के रूप में mainव्यापक पहले अभ्यास को पहचानता है। argv[argc]सूची के अंत के लिए एक निरर्थक जांच प्रदान करने के लिए एक शून्य सूचक होने की आवश्यकता है, वह भी सामान्य अभ्यास के आधार पर।


19

यह ऐतिहासिक कारणों और पुराने कोड के साथ संगतता के लिए है। मूल रूप से, इस बात की कोई गारंटी नहीं थी कि अरगव सरणी के अंतिम तत्व के रूप में एक शून्य सूचक मौजूद होगा। लेकिन argc हमेशा से अस्तित्व में रहा है।


... जो एक तरह से शर्म की बात है। यदि हमारे पास था int main(char *argv[], int argc, ...), तो कुछ कार्यक्रम सिर्फ argcइसलिए छोड़ सकते थे क्योंकि उन्हें इसकी आवश्यकता नहीं है। विपरीत (जरूरत है argcलेकिन नहीं argv) शायद एक वास्तविक कार्यक्रम में कभी उपयोगी नहीं है।
हाइड

@II: ऊपर की टिप्पणी देखें बासीले स्टारीनेविच
zentrunix

6

हमें इसकी "आवश्यकता" है, क्योंकि यह विभिन्न मानकों द्वारा आवश्यक है।

हम मूल्य को पूरी तरह से नजरअंदाज करने के लिए स्वतंत्र हैं, लेकिन चूंकि यह पहला पैरामीटर है main, इसलिए हमें इसे पैरामीटर सूची में होना चाहिए। C ++ में (और शायद गैर-मानक C बोलियाँ), आप बस इस C ++ स्निपेट (C में कनवर्ट करना आसान) की तरह, पैरामीटर नाम को छोड़ सकते हैं:

#include <stdio.h> // C-compatible include, guarantees puts in global namespace

// program will print contents of argv, one item per line, starting from argv[0]

int main(int /*argc*/, char *argv[]) { // uncomment argc for C

    //(void)argc; // uncomment statement for C

    for (int i=0; argv[i]; ++i) {
        puts(argv[i]);
    }

    return 0;
}

मानक सी में, आम चेतावनी सेटिंग्स के साथ, अप्रयुक्त पैरामीटर चेतावनी उत्पन्न करता है, जिसे एक बयान द्वारा तय किया जा सकता है जैसे (void)argc;कि किसी भी कोड को उत्पन्न किए बिना नाम का उपयोग करने का कारण बनता है।

argcके लिए अच्छा है, क्योंकि अन्यथा कई कार्यक्रमों को गिनती प्राप्त करने के लिए मापदंडों को थोरुघल चलने की आवश्यकता होगी। इसके अलावा, कई प्रोग्रामिंग भाषाओं में सरणियों के साथ जिनकी लंबाई होती है, कोई भी argcपैरामीटर नहीं होता है , वस्तुओं के साथ एक सरणी होती है।


प्रश्न C और C ++ दोनों के बारे में है। सी में, पैरामीटर नाम की आवश्यकता है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.