यह एक स्ट्रिंग शाब्दिक के साथ एक चार सरणी इनिशियलाइज़ करने के लिए वैसे भी खराब अभ्यास है।
उस टिप्पणी के लेखक कभी भी इसे सही नहीं ठहराते हैं, और मुझे यह कथन अजीब लगता है।
C में (और आपने इसे C के रूप में टैग किया है), यह एक स्ट्रिंग मान के साथ एक सरणी को इनिशियलाइज़ करने का एकमात्र तरीका है char
(आरंभीकरण असाइनमेंट से अलग है)। आप लिख भी सकते हैं
char string[] = "october";
या
char string[8] = "october";
या
char string[MAX_MONTH_LENGTH] = "october";
पहले मामले में, सरणी का आकार इनिशलाइज़र के आकार से लिया गया है। स्ट्रिंग साहित्यिकों को char
एक समाप्ति 0 बाइट के साथ सरणियों के रूप में संग्रहीत किया जाता है , इसलिए सरणी का आकार 8 ('o', 'c', 't', 'o', 'b', 'e', 'r') है। 0)। दूसरे दो मामलों में, ऐरे का आकार घोषणा के भाग के रूप में निर्दिष्ट किया गया है (8 और MAX_MONTH_LENGTH
, जो कुछ भी होता है)।
आप जो नहीं कर सकते हैं वह कुछ इस तरह से लिखें
char string[];
string = "october";
या
char string[8];
string = "october";
आदि पहले मामले में, की घोषणा string
है अधूरा है क्योंकि कोई सरणी आकार निर्दिष्ट किया गया है और वहाँ से आकार लेने की कोई प्रारंभकर्ता है। दोनों मामलों में, =
काम नहीं करेगा क्योंकि (क) एक सरणी अभिव्यक्ति जैसे कि string
असाइनमेंट का लक्ष्य नहीं हो सकता है और बी) =
ऑपरेटर किसी भी तरह से एक सरणी की सामग्री को कॉपी करने के लिए परिभाषित नहीं है।
उसी टोकन से, आप लिख नहीं सकते
char string[] = foo;
जहां foo
का एक और सरणी है char
। आरंभीकरण का यह रूप केवल स्ट्रिंग शाब्दिक के साथ काम करेगा।
संपादित करें
मुझे यह कहने के लिए संशोधन करना चाहिए कि आप ऐरे-स्टाइल इनिशियलाइज़र के साथ एक स्ट्रिंग को पकड़ने के लिए ऐरे को भी इनिशियलाइज़ कर सकते हैं, जैसे
char string[] = {'o', 'c', 't', 'o', 'b', 'e', 'r', 0};
या
char string[] = {111, 99, 116, 111, 98, 101, 114, 0}; // assumes ASCII
लेकिन यह आंखों पर स्ट्रिंग शाब्दिक का उपयोग करने के लिए आसान है।
EDIT 2
एक घोषणा के बाहर एक सरणी की सामग्री को असाइन करने के लिए , आपको या तो strcpy/strncpy
(0-समाप्त स्ट्रिंग्स के लिए) या memcpy
(किसी अन्य प्रकार के सरणी के लिए) का उपयोग करने की आवश्यकता होगी:
if (sizeof string > strlen("october"))
strcpy(string, "october");
या
strncpy(string, "october", sizeof string); // only copies as many characters as will
// fit in the target buffer; 0 terminator
// may not be copied, but the buffer is
// uselessly completely zeroed if the
// string is shorter!