2010-10-09 21 views
63

संभावित डुप्लिकेट:
What are the arguments to main() for?
What does int argc, char *argv[] mean?के बारे में 'मुख्य (int argc, char * argv [])'

हर कार्यक्रम main(int argc, char *argv[]) परिभाषा के साथ शुरू हो रहा है।

मुझे समझ में नहीं आता कि इसका क्या अर्थ है। अगर हम प्रोग्राम में इनका उपयोग नहीं करते हैं तो हम इन तर्कों का उपयोग क्यों करते हैं, तो मैं बहुत खुश हूं? क्यों नहीं: int main()?

कार्यक्रम का नाम *argv[] और argc के तत्वों में से एक है *argv[] में तर्कों की संख्या की संख्या है? *argv[] पर भेजे गए अन्य तर्क क्या हैं? हम उन्हें कैसे भेजते हैं?

+1

ध्यान दें कि यदि आप आदेश पंक्ति तर्क उपयोग करने का इरादा नहीं है, यह पूरी तरह अनुमेय (और बहुत समझदार) है समारोह 'पूर्णांक मुख्य (शून्य)' या 'पूर्णांक मुख्य()' परिभाषित करने के लिए। सी 99 या सी 11 में रिटर्न टाइप ('int') अनिवार्य है; कंपाइलर्स कभी-कभी आपको इसे छोड़ देते हैं यदि आप निर्दिष्ट नहीं करते हैं कि आपके कोड का सी मानक का कौन सा संस्करण पालन करता है। यह भी देखें [सी और सी ++ में 'मुख्य()' वापसी क्या होनी चाहिए (http://stackoverflow.com/questions/204476/)। –

उत्तर

88

तर्क argc और main की argv एक कार्यक्रम के लिए तर्क भेजने के लिए एक मार्ग के रूप में प्रयोग किया जाता है, संभवतः सबसे परिचित तरीका अच्छा ol 'टर्मिनल जहां एक उपयोगकर्ता टाइप कर सकते हैं cat file उपयोग करने के लिए है। यहां cat शब्द एक प्रोग्राम है जो फ़ाइल लेता है और मानक आउटपुट (stdout) पर आउटपुट करता है।

कार्यक्रम, argc में तर्क की संख्या और argv में बहस के वेक्टर प्राप्त करता है ऊपर आर्ग ument ount में दो (पहला तर्क के रूप में कार्यक्रम का नाम गिना जाता है) और आर्ग होगा ument v ईक्टर में [cat, file, शून्य] शामिल होगा। जबकि अंतिम तत्व शून्य-सूचक है।

सामान्य रूप से, आप इसे इस प्रकार लिखते थे:

int main() { 
    // code 
    return 0; // Zero indicates success, while any 
    // Non-Zero value indicates a failure/error 
} 
:

int // Specifies that type of variable the function returns. 
    // main() must return an integer 
main (int argc, char **argv) { 
    // code 
    return 0; // Indicates that everything went well. 
} 

अपने कार्यक्रम किसी भी तर्क की आवश्यकता नहीं है तो वह निम्नलिखित फैशन में एक main समारोह लिखने के लिए समान रूप से मान्य है

सी भाषा के शुरुआती संस्करणों में, main से पहले कोई संकेत नहीं था। आज, यह एक त्रुटि माना जाता है।

POSIX -compliant सिस्टम (और Windows) पर, वहाँ संभावना एक तिहाई पैरामीटर char **envp जो प्रोग्राम environment variables का एक वेक्टर शामिल उपयोग करने के लिए मौजूद है। main फ़ंक्शन की तर्क सूची के आगे भिन्नताएं मौजूद हैं, लेकिन मैं इसे यहां विस्तार से नहीं बताऊंगा क्योंकि यह गैर-मानक है।

इसके अलावा, चर के नामकरण सम्मेलन है और इसका कोई वास्तविक अर्थ नहीं है। यह हमेशा एक अच्छा विचार इस का पालन करने के लिए इतना है कि आप अन्य लोगों को भ्रमित नहीं करना है, लेकिन यह भी उतना ही main

int main(int c, char **v, char **e) { 
    // code 
    return 0; 
} 

के रूप में और अपने दूसरे प्रश्न के लिए, वहाँ एक करने के लिए तर्क भेजने के लिए कई तरीके हैं परिभाषित करने के लिए वैध होगा कार्यक्रम। मैं तुम्हें exec*()family of functions जो POSIX -मानक है को देखने के लिए सिफारिश करेंगे, लेकिन यह शायद आसान सिर्फ system("command arg1 arg2") उपयोग करने के लिए है, लेकिन system() का इस्तेमाल आम तौर पर के रूप में यह हर प्रणाली पर काम करने की गारंटी नहीं है सिकोड़ी है। मैंने इसे स्वयं परीक्षण नहीं किया है; लेकिन अगर कोई bash, zsh, या अन्य खोल एक * NIX-सिस्टम पर स्थापित है, system() असफल हो जायेगी।

+0

यदि मैं 'argc' के न्यूनतम संभव मूल्य से गलत नहीं हूं 1 और 'argv [0]' स्ट्रिंग'।/Mymainprogram' रखता है जबकि 'argv [1] '' NULL' है। मेरे प्रश्न हैं- ** 1: ** 'argc' धारण करने वाला अधिकतम मूल्य क्या है? ** 2: ** इन स्ट्रिंग्स को क्या हैं जो 'argv []' में जोड़े गए हैं? – barnes

+1

@barnes - अधिकतम ओएस निर्भर है। Win32 में कमांड लाइन की लंबाई 32K है, इसलिए 'argc' की व्यावहारिक सीमा 16K है। –

+1

आज आपके 1k प्रतिष्ठित मील का पत्थर पर बधाई! – wizzwizz4

0

argc कमांड लाइन तर्कों की संख्या और argv कमांड लाइन तर्कों का प्रतिनिधित्व करने वाले तारों की सरणी है।

यह आपको प्रोग्राम में दिए गए तर्कों पर प्रतिक्रिया करने का विकल्प देता है। यदि आप किसी की अपेक्षा नहीं कर रहे हैं, तो आप int main का भी उपयोग कर सकते हैं।

13

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

इस प्रकार आप पैरामीटर (जैसे -version) का उपयोग कर सकते हैं जब आपका एप्लिकेशन एक अलग तरीके से कार्य करना शुरू कर दिया जाता है।

लेकिन क्या आप भी int main(void) एक प्रोटोटाइप के रूप सी

में उपयोग कर सकते हैं एक तिहाई (कम जाना जाता है और अमानक) एक तीसरा तर्क जो envp है साथ प्रोटोटाइप है। इसमें पर्यावरण चर शामिल हैं।


संसाधन:

+0

कार्यक्रम के नाम को मुख्य() में दिए गए तर्कों के साथ क्या करना है? –

+1

@Potatoswatter, @You, मैंने स्पष्ट रूप से यह कहने के लिए मेरा जवाब अपडेट किया कि envp मानक नहीं है। @ फ़हाद, आमतौर पर पहला तर्क एप्लिकेशन का नाम होता है, इस तरह आप जान सकते हैं कि आपका एप्लिकेशन कैसा कहलाता है। –

+0

बस इसके नाम से, आप कैसे जानेंगे कि इसे कैसे कहा जाता है? –

3

argc तर्क यह है कि कार्यक्रम के लिए पारित कर रहे हैं की संख्या का मतलब है। char* argv[] उत्तीर्ण तर्क हैं। argv[0] हमेशा कार्यक्रम का नाम है। मैं 100% निश्चित नहीं हूं, लेकिन मुझे लगता है कि int main() सी/सी ++ में मान्य है।

+0

के रूप में प्रत्येक के सबसे अक्सर इस्तेमाल किया कार्यक्षमता) को लागू करने 'पूर्णांक मुख्य()' सी में मान्य है ++ केवल। सी में आपको एक शून्य की आवश्यकता है: 'int मुख्य (शून्य)'। सी-शैली 'int मुख्य (शून्य)' सी ++ में भी मान्य है हालांकि सी ++ में इसका उपयोग निराश है। – Ultimater

+0

@Ultimater मैं बहुत यकीन है कि 'पूर्णांक मुख्य()' भी सी में मान्य है यह एक varargs समारोह की घोषणा की। – Navin

+0

@Navin कई सी ++ कंपाइलर्स बहुत ही क्षमा कर रहे हैं जब उन्हें सी कोड का सामना करना पड़ता है क्योंकि सी ++ दोनों int int() 'और' int main (void) 'को संकलित करने की अनुमति देता है, लेकिन एक सी कंपाइलर, निश्चित रूप से एक पुराना सी कंपाइलर, समर्थन नहीं करेगा सी ++ शैली 'int मुख्य() '। मैंने सी/सी ++ पर एक कोर्स लिया जिसने पोर्टेबिलिटी पर जोर दिया, और यदि आपका असाइनमेंट सी में लिखा जाना था और आपने इसे 'int main()' घोषणा दी, तो उसका असाइनमेंट चेकर शिकायत करेगा, इसे संकलित भी नहीं करेगा , और जब तक हम इसे समय सीमा से पुनः सबमिट नहीं करते हैं, हम असाइनमेंट पर अंक खो देंगे। – Ultimater

39

उन कमांड लाइन से अपने कार्यक्रम के लिए तर्क गुजर, उदाहरण के लिए, जब एक कार्यक्रम शुरू हो जाती है

$ gcc mysort.c -o mysort 

$ mysort 2 8 9 1 4 5 

ऊपर, कार्यक्रम mysort कुछ कमांड लाइन पैरामीटर के साथ क्रियान्वित किया जाता है के लिए कर रहे हैं।main(int argc, char * argv[]) के अंदर, इस

Argument Count, argc = 7 

में परिणाम के बाद से वहाँ 7 तर्कों (कार्यक्रम की गिनती), और

Argument Vector, argv[] = { "mysort", "2", "8", "9", "1", "4", "5" }; 

पूर्ण उदाहरण है निम्नलिखित हैं जाएगा।

$ cat mysort.c 
#include <stdio.h> 
int main(int argc, char * argv []) { 
    printf("argc = %d\n", argc); 
    for(int i = 0; i < argc; ++i) { 
     printf("argv[ %d ] = %s\n", i, argv[ i ]); 
    } 
} 

$ gcc mysort.c -o mysort 

$ ./mysort 2 8 9 1 4 5 
argc = 7 
argv[ 0 ] = ./mysort 
argv[ 1 ] = 2 
argv[ 2 ] = 8 
argv[ 3 ] = 9 
argv[ 4 ] = 1 
argv[ 5 ] = 4 
argv[ 6 ] = 5 

[char तार "2", "8" आदि संख्या रूपांतरण समारोह, उदा करने के लिए कुछ चरित्र का उपयोग कर संख्या में बदला जा सकता atol()(link)]

0

argc कार्यावधि में कार्यक्रम के लिए दिया आदेश पंक्ति तर्क की संख्या है, और argv पात्रों में से सरणियों (बल्कि, सी-तार की एक सरणी) युक्त इन तर्कों की एक सरणी है। क्या आप जानते हैं आप आदेश पंक्ति तर्क की जरूरत करने के लिए नहीं जा रहे हैं, तो आप एक void तर्क लेने पर आपका मुख्य घोषणा कर सकते हैं, बजाय:

int main(void) { 
    /* ... */ 
} 

उन केवल दो प्रोटोटाइप main मानकों के अनुसार के लिए परिभाषित कर रहे हैं, लेकिन कुछ कंपाइलर void के रिटर्न प्रकार की अनुमति भी देते हैं। इस on Wikipedia पर और अधिक।

+1

int main() {} ठीक है – Nikko

+0

तकनीकी रूप से, 'int main()' एक मनमाने ढंग से कई तर्क ले रहा है, जबकि 'int main (शून्य)' बिल्कुल शून्य तर्क लेता है, इसलिए बाद वाला अधिक सही है। – You

+2

नहीं, * परिभाषा * में, 'int main()' कोई फ़ंक्शन नहीं लेता है। * घोषणा * में जो परिभाषा नहीं है, यह एक कार्य अनिर्धारित पैरामीटर ले रहा है। यह n1256 में 6.7.5.3/14 है, या 6.57.3/10 n794 में है।प्रश्नकर्ता एक परिभाषा के बारे में पूछ रहा है। –

0

आप app -something -somethingelse जैसे पैरामीटर के साथ अपना आवेदन चला सकते हैं। int argc इन पैरामीटरों की संख्या का प्रतिनिधित्व करता है और char *argv[] एक सरणी है जिसमें आपके एप्लिकेशन में वास्तविक पैरामीटर पारित किए जाते हैं। इस तरह आप अपने आवेदन के अंदर उनके साथ काम कर सकते हैं।

1

comp.lang.c FAQ

"What's the correct declaration of main()?"
Question 11.12a में प्रश्न के साथ सौदा करता है।

+2

... लेकिन यह comp.lang.c नहीं है, यह स्टैक ओवरफ्लो है, एक समुदाय जहां हम * मदद * लोगों को उनके सवालों का जवाब देकर * मदद करते हैं, उन्हें मैनुअल, एफएक्यू, या एलएमजीटीएफई लिंक पर रीडायरेक्ट नहीं करते हैं। –

+1

प्रश्न पहले ही उत्तर दिया गया था। सी अकसर किये गए सवाल, हालांकि अभी भी पढ़ने लायक है, imho। लेकिन यह अपने लाइसेंस में बताता है कि इसे अनुमति के बिना पुन: उत्पन्न नहीं किया जा सकता है। इसलिए लिंक। बस पूर्णता के लिए। – cschol

संबंधित मुद्दे