2012-06-13 11 views
33

तो मुझे आश्चर्य है कि कमांड लाइन पैरामीटर हमेशा शून्य समाप्त हो जाते हैं? Google हां कहता है, और जीसीसी पर संकलन इंगित करता है कि यह मामला है, लेकिन क्या मैं हमेशा यह सच होने की गारंटी दे सकता हूं?मुख्य नल में char * argv [] तर्क हैं?

int main(int argc, char** argv) 
{ 
    char *p; 

    for(int cnt=1; cnt < argc; ++cnt) 
    { 
     p = argv[cnt]; 
     printf("%d = [%s]\n", cnt, p); 
    } 
    return 0; 
} 

$ MyProgram -arg1 -arg2 -arg3 
1 = -arg1 
2 = -arg2 
3 = -arg3 
+4

हाँ, यह सच है। – kol

+2

एक मिनट के लिए सोचें: * क्या होगा यदि वे पूर्ण रूप से समाप्त नहीं हुए थे? * –

+0

एक मिनट के लिए सोच रहा है ... char [] और char * स्वचालित रूप से सी-शैली स्ट्रिंग को इंगित नहीं करता है। जाहिर है कि पूरी कमांड लाइन स्ट्रिंग को निरस्त कर दिया गया है लेकिन उसे कम से कम कमांड लाइन पर पारित वर्णों के प्रत्येक अलग-अलग सरणी में अनुवाद करने की आवश्यकता नहीं है। कमांड लाइन पर व्हाइटस्पेस को बाहर निकालने के लिए Argv के लिए यह आसान होगा और सी शून्य स्टाइल तारों को न तो समाप्त कर दिया गया है। – LeviX

उत्तर

56

हां। argv सरणी में पॉइंटर्स सी स्ट्रिंग्स को इंगित करते हैं, जो परिभाषा शून्य से समाप्त होते हैं।

सी भाषा मानक बस कहता है कि सरणी सदस्यों में "तारों के लिए पॉइंटर्स होंगे" (सी 99 §5.1.2.2.1/2)। एक स्ट्रिंग "पहले शून्य चरित्र" (सी 99 §7.1.1/1) द्वारा समाप्त वर्णों के एक संगत अनुक्रम "है, यानी, वे परिभाषा द्वारा निरस्त कर दिए गए हैं।

आगे, argv[argc] पर सरणी तत्व एक शून्य सूचक है, इसलिए सरणी स्वयं भी एक अर्थ में "शून्य समाप्त हो गई है।"

+0

यदि आप argv को समाप्त कर दिया गया है तो क्या आप argc के उपयोग की व्याख्या कर सकते हैं। क्या हम नहीं पता कर सकते हैं। '\ 0' तक पहुंचने तक सरणी को घुमाने के द्वारा तर्कों का .. .. – Snehasish

+0

@ स्नेहाशीश हां, आप 'argv' से 'argc' की गणना कर सकते हैं। क्यों 'मुख्य' के पास हस्ताक्षर है, मैं निश्चित रूप से नहीं जानता। इससे पहले कि मैं अस्तित्व में था, यह इस तरह से किया गया है। –

+0

मुझे लगता है कि इसके ऐतिहासिक कारणों के लिए ... – Snehasish

4

हां, यह हमेशा सच है कि तर्क शून्य समाप्त तार हैं।

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