2012-04-21 14 views
5

के साथ समाप्त होना चाहिए क्यों एक char सरणी को शून्य वर्ण के साथ समाप्त होना चाहिए। क्या कोई कारण है कि मुझे हर चार सरणी में शून्य चरित्र जोड़ना है?क्यों एक चार सरणी को शून्य वर्ण


ऐसा लगता है कि वे एक ही तरह से उपचार कराएँ।

उत्तर

3

सी में, यदि आपके पास किसी सरणी के लिए पॉइंटर है, तो उस सरणी की लंबाई निर्धारित करने का कोई तरीका नहीं है। जैसा कि @AProgrammer बताता है, डिजाइनर इसे छोड़ सकते थे और प्रोग्रामर को सभी चरित्र सरणी की लंबाई का ट्रैक रखने के लिए मजबूर कर दिया था। हालांकि, इससे सी में टेक्स्ट प्रोसेसिंग पहले से कहीं अधिक कठिन हो गई होगी।

इसलिए भाषा डिजाइनरों एक परंपरा है कि स्ट्रिंग की लंबाई एक अशक्त चरित्र स्ट्रिंग के अंत का संकेत है की मौजूदगी से अनुमान लगाया जा करने की अनुमति होगी पर बसे।

उदाहरण के लिए, strcpy पर विचार करें:

char *strcpy(char *destination, const char *source); 

सी में कोई रास्ता नहीं है कि संकेत destination और source बात करने के लिए सरणी की लंबाई निर्धारित करने के लिए नहीं है। इसलिए, स्ट्रिंग के अंत को इंगित करने के लिए एक सेंटीनेल मान की उपस्थिति के बिना, एकमात्र अन्य समाधान source स्ट्रिंग की लंबाई को इंगित करने वाले अतिरिक्त पैरामीटर को पारित करना होगा।

बेशक

, आधुनिक सुरक्षा विचारों, स्ट्रिंग प्रसंस्करण कार्यों कि बफर लंबाई पैरामीटर प्राप्त की रोशनी में पेश किया गया है। लेकिन कंप्यूटिंग परिदृश्य उस समय बहुत अलग दिखता था जब नल-टर्मिनेटेड स्ट्रिंग का आविष्कार किया गया था।

+0

हाँ, लेकिन मेरा मतलब है कि अगर मैंने चार arr [2] = {'h', 'i'} किया है; मुझे लगता है कि संकलक एआर की लंबाई जानता है। –

+0

@AlexDannk हां यह सच है। लेकिन यह स्पष्ट रूप से उपयोगी नहीं है अगर सभी तारों को एक ही लंबाई के लिए बाध्य किया जाता है। –

+0

क्षमा करें! मुझे समझ में नहीं आया कि इसका मतलब क्या है।आपने कहा कि सरणी की लंबाई जानने के लिए यह उपयोगी है। लेकिन संकलक पहले से ही किसी भी सरणी की लंबाई जानता है। इसलिए मुझे यह उपयोगी नहीं लगता –

0

आम तौर पर ऐसा करने का कोई कारण नहीं है, लेकिन आपको पता होना चाहिए कि प्रत्येक स्ट्रिंग परिभाषा के अनुसार, char सरणी शून्य टर्मिनेटर के साथ है। यदि आपकी char सरणी एक स्ट्रिंग का प्रतिनिधित्व करती है तो यदि आप शून्य टर्मिनेटर को छोड़ देते हैं तो सी स्ट्रिंग के साथ काम करने वाले प्रत्येक फ़ंक्शन सही मान वापस नहीं करेगा या अपेक्षा से अलग व्यवहार करेगा।

हालांकि charint, float या double की तरह एक प्रकार है, तो आप के रूप में आप की तरह char सारिणी निर्मित करने के लिए स्वतंत्र हैं, के लिए उन्हें अशक्त-समाप्त होने की आवश्यकता के बिना।

8

एक चार सरणी अशक्त समाप्त किया जा की जरूरत नहीं है (मानक पुस्तकालय कार्यों जो इस में शामिल हैं memcpy, memmove, strncpy पर निर्भर नहीं है - बुरी तरह से नामित इस नवीनतम एक -, सही प्रारूप स्ट्रिंग साथ printf)।

एक NUL समाप्त चरित्र स्ट्रिंग (NTCs) परिभाषा के द्वारा की जरूरत है एक NUL द्वारा समाप्त किया जा करने के लिए। यह प्रारूप सी मानक पुस्तकालय और सम्मेलन सबसे सी कार्यक्रम द्वारा प्रयोग किया जाता का स्ट्रिंग से निपटने उपयोगिताओं द्वारा की उम्मीद है (सी ++ में, एक आम तौर पर std :: स्ट्रिंग का उपयोग)

+0

तो यह एक convenionion की तरह है! लेकिन उन्होंने ऐसा क्यों किया। इसे शून्य-समाप्त नहीं करने के लिए बहुत आसान नहीं हो सका। मुझे यह नहीं मिला। मैंने पढ़ा है कि उदाहरण के लिए जब मैं एक नल-टर्मिनेटेड सरणी को पेंटआउट करता हूं तो संकलक को प्रिंटिंग बंद करना कब पता चलेगा। तो क्या यह शून्य चरित्र किसी भी तरह के जंक पात्रों को प्रिंट करने से रोकने के लिए उपयोगी है। धन्यवाद! –

+0

@Alex आपके प्रस्तावित डिज़ाइन में, सभी तारों को एक ही लंबाई होना चाहिए। –

+0

@ एलेक्स, एक अंत मार्कर (जैसे एनयूएल) के विकल्प, लंबाई क्षेत्र होना है। व्यावहारिक रूप से, एक सेंटीनेल के साथ काम करने से अक्सर एल्गोरिदम को सरल बना दिया जाता है, और यह आपको उन सभी के लिए ओवरहेड भुगतान किए बिना स्ट्रिंग के लिए मनमाने ढंग से अधिकतम आकार नहीं देता है (हाँ, उस समय एक बाइट या दो बाइट्स आकार फ़ील्ड के बीच चयन करना होगा कड़ी मेहनत कर रही है, याददाश्त तंग थी, लेकिन खुद को 255 वर्णों तक सीमित कर रही थी? मुझे लगता है कि बाद में ऐसा होता जो चुना गया होता)। – AProgrammer

0

आप एक स्ट्रिंग के रूप में उपयोग करना चाहते हैं सिर्फ अगर। फिर सभी सी/सी ++ स्ट्रिंग फ़ंक्शंस अंत में शून्य चार्ट की खोज करेंगे, और यदि यह वहां नहीं है, तो वे खोज जारी रखेंगे और जल्द ही या बाद में आपका एप्लिकेशन क्रैश हो जाएगा।

आप केवल, वर्ण की सरणी के रूप में सरणी वर्ण का उपयोग करने के लिए कभी नहीं तार, तो कोई समस्या नहीं के रूप में उन्हें का जिक्र करना चाहते हैं। यह वास्तव में चींटियों की एक सरणी की तरह है।

+0

इसके बारे में क्या। चार एआर [2] = {'एच', 'मैं'}; cout << arr; तो क्यों यह क्रैश नहीं होता है क्योंकि संकलक को शून्य चरित्र को समाप्त नहीं किया जाएगा। –

+0

@Alex - यह कभी-कभी काम करता प्रतीत होता है, लेकिन परिणाम वास्तव में अपरिभाषित है। हम सरणी के बाद अगले बाइट के मान को नहीं जानते हैं - यह शून्य हो सकता है। उस स्थिति में, प्रदर्शित मूल्य अच्छा दिखता है। यदि नहीं, तो प्रोग्राम कचरा, या दुर्घटना प्रदर्शित कर सकता है। –

+0

@ बोपरसन: बहुत बहुत धन्यवाद –

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