C. में स्ट्रिंग्स की एक सरणी बनाने के कई तरीके हैं। यदि सभी स्ट्रिंग्स एक ही लंबाई (या कम से कम एक ही अधिकतम लंबाई) होने जा रहे हैं, तो आप बस 2-डी सरणी की घोषणा करते हैं और आवश्यकतानुसार असाइन करते हैं:
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1];
...
strcpy(strs[0], aString); // where aString is either an array or pointer to char
strcpy(strs[1], "foo");
आप इनिशियलाइज़र की सूची भी जोड़ सकते हैं:
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1] = {"foo", "bar", "bletch", ...};
यह मानता है कि इनिशियलाइज़र में स्ट्रिंग्स का आकार और संख्या आपके सरणी आयामों के साथ मेल खाती है। इस स्थिति में, प्रत्येक स्ट्रिंग शाब्दिक की सामग्री (जो कि स्वयं एक शून्य-समाप्त सारणी है) को strs के लिए आवंटित मेमोरी में कॉपी किया जाता है। इस दृष्टिकोण के साथ समस्या आंतरिक विखंडन की संभावना है; यदि आपके पास 99 तार हैं जो 5 वर्ण या उससे कम हैं, लेकिन 1 तार जो 20 वर्ण लंबा है, तो 99 तार कम से कम 15 अप्रयुक्त वर्ण रखने वाले हैं; यह अंतरिक्ष की बर्बादी है।
2-डी सरणी का उपयोग करने के बजाय, आप 1-डी सरणी के संकेत को चार में स्टोर कर सकते हैं:
char *strs[NUMBER_OF_STRINGS];
ध्यान दें कि इस स्थिति में, आपने केवल स्ट्रिंगर्स को पॉइंटर्स रखने के लिए मेमोरी आवंटित की है; स्ट्रिंग्स के लिए मेमोरी को कहीं और आवंटित किया जाना चाहिए (या तो स्थिर सरणियों के रूप में या उपयोग करके malloc()
या calloc()
)। आप पहले के उदाहरण की तरह इनिशियलाइज़र सूची का उपयोग कर सकते हैं:
char *strs[NUMBER_OF_STRINGS] = {"foo", "bar", "bletch", ...};
स्ट्रिंग स्थिरांक की सामग्री की प्रतिलिपि बनाने के बजाय, आप बस उन्हें संकेत भेज रहे हैं। ध्यान दें कि स्ट्रिंग स्थिरांक लेखन योग्य नहीं हो सकते हैं; आप पॉइंटर को पुन: असाइन कर सकते हैं, जैसे:
strs[i] = "bar";
strs[i] = "foo";
लेकिन आप स्ट्रिंग की सामग्री को बदलने में सक्षम नहीं हो सकते हैं; अर्थात,
strs[i] = "bar";
strcpy(strs[i], "foo");
अनुमति नहीं दी जा सकती।
आप malloc()
प्रत्येक स्ट्रिंग के लिए बफर को गतिशील रूप से आवंटित करने और उस बफर को कॉपी करने के लिए उपयोग कर सकते हैं :
strs[i] = malloc(strlen("foo") + 1);
strcpy(strs[i], "foo");
Btw,
char (*a[2])[14];
14-तत्व सरणियों के लिए संकेत के 2-तत्व सरणी के रूप में घोषित करता है।
char (*a[2])[14]
दो बिंदुओं की एक सरणी 14 वर्णों की एक सरणी है।