क्या सभी तारों को वर्णों की एक सरणी माना जा सकता है ( हां ), क्या सभी वर्ण सरणियों को तार ( नहीं ) माना जा सकता है ।
क्यों नहीं? और क्यों इससे फर्क पड़ता है?
अन्य उत्तरों के अलावा यह बताते हुए कि एक स्ट्रिंग की लंबाई को स्ट्रिंग के भाग के रूप में कहीं भी संग्रहीत नहीं किया जाता है और मानक के संदर्भ में जहां स्ट्रिंग को परिभाषित किया गया है, फ्लिप-साइड "सी लाइब्रेरी फ़ंक्शंस स्ट्रिंग्स को कैसे संभालते हैं?"
जबकि एक वर्ण सरणी समान वर्णों को धारण कर सकती है, यह केवल वर्णों की एक सरणी है जब तक कि अंतिम वर्ण के बाद शून्य- वर्ण का चरित्र नहीं होता है। वह शून्य-समाप्ति वर्ण वह है जो वर्णों की सरणी को एक स्ट्रिंग के रूप में माना जाता है (संभाला जाता है)।
C के सभी कार्य जो एक स्ट्रिंग की अपेक्षा करते हैं एक तर्क के रूप में वर्णों के अनुक्रम को शून्य-समाप्त किए जाने की अपेक्षा करते हैं । क्यों?
यह सभी स्ट्रिंग फ़ंक्शंस के काम करने के तरीके के साथ करना है। चूंकि लंबाई किसी सरणी, स्ट्रिंग-फ़ंक्शंस के भाग के रूप में शामिल नहीं है, इसलिए सरणी में आगे को स्कैन करें जब तक कि nul-character (जैसे '\0'
- दशमलव के बराबर 0
) नहीं मिला। ASCII तालिका और विवरण देखें । भले ही आप उपयोग कर रहे strcpy
, strchr
, strcspn
, आदि .. सभी स्ट्रिंग कार्यों पर भरोसा करते हैं नुल-समाप्त चरित्र मौजूद होने को परिभाषित करता है कि वह स्ट्रिंग के अंत है।
से दो समान कार्यों की तुलना नुल-टर्मिनेटिंग चरित्र string.h
के महत्व पर जोर देगी । उदाहरण के लिए:
char *strcpy(char *dest, const char *src);
strcpy
समारोह बस प्रतियां से बाइट्स src
के लिए dest
जब तक नुल-समाप्त चरित्र पाया जाता है कह strcpy
जहां पात्रों को कॉपी को रोकने के लिए। अब इसी तरह के समारोह में ले memcpy
:
void *memcpy(void *dest, const void *src, size_t n);
फ़ंक्शन एक समान ऑपरेशन करता है, लेकिन src
स्ट्रिंग होने के लिए पैरामीटर पर विचार या आवश्यकता नहीं करता है । चूँकि बाइट्स को कॉपी करने के लिए एक न्यूल-टर्मिनेटिंग कैरेक्टर तक पहुंचने तक memcpy
बस स्कैन नहीं किया जा सकता , इसलिए इसे तीसरे पैरामीटर के रूप में कॉपी करने के लिए बाइट्स की एक स्पष्ट संख्या की आवश्यकता होती है। यह तीसरा पैरामीटर एक ही आकार की जानकारी प्रदान करता है, जब तक कि एक शून्य-समाप्ति वर्ण नहीं पाया जाता है, तब तक इसे स्कैन करके आसानी से प्राप्त किया जा सकता है।src
dest
memcpy
strcpy
(जो यह भी जोर देता है कि क्या गलत हो जाता है strcpy
(या किसी फ़ंक्शन को स्ट्रिंग की अपेक्षा करते हुए) यदि आप फ़ंक्शन को एक शून्य -टर्म स्ट्रिंग प्रदान करने में विफल रहते हैं - इसका कोई पता नहीं है कि आपके मेमोरी सेगमेंट के बाकी हिस्सों में कहां रुकना और खुशी से दौड़ना होगा अपरिभाषित व्यवहार का आह्वान तब तक करना जब तक कि एक शून्य चरित्र स्मृति में कहीं न कहीं पाया जाता है - या एक खंडन दोष)
यही कारण है कि क्यों एक उम्मीद कार्यों नुल-समाप्त स्ट्रिंग एक पास किया जाना चाहिए नुल-समाप्त स्ट्रिंग और यह क्यों महत्वपूर्ण है ।
char str[] = "hello";
मामले का उल्लेख करना चाहिए ।