strncpy
कभी नहीं सही जवाब है जब अपने गंतव्य स्ट्रिंग शून्य समाप्त होता है के लिए अंक dst_ptr करने के लिए। strncpy
एक ऐसा फ़ंक्शन है जिसका उपयोग गैर-समाप्त निश्चित-चौड़ाई तारों के साथ किया जाना है। अधिक सटीक, इसका उद्देश्य एक शून्य-समाप्त स्ट्रिंग को एक गैर-समाप्ति वाली निश्चित-चौड़ाई वाली स्ट्रिंग (प्रतिलिपि बनाकर) में परिवर्तित करना है। दूसरे शब्दों में, strncpy
अर्थपूर्ण रूप से यहां लागू नहीं है।
आपके पास यहां मौजूद वास्तविक विकल्प strlcpy
और सादा strcpy
के बीच है।
आप dst_arr
को "सुरक्षित" (अर्थात संभावित छोटा) नकल प्रदर्शन करने के लिए चाहते हैं, तो उपयोग करने के लिए उचित समारोह strlcpy
है।
dst_ptr
के लिए ... "dst_ptr
पर प्रतिलिपि" जैसी कोई चीज़ नहीं है। आप मेमोरी पर dst_ptr
पर प्रतिलिपि बना सकते हैं, लेकिन पहले आपको यह सुनिश्चित करना होगा कि यह कहीं कहीं इंगित करता है और उस स्मृति को आवंटित करता है। ऐसा करने के कई तरीके हैं।
उदाहरण के लिए, आप dst_ptr
को dst_arr
पर इंगित करने के लिए बना सकते हैं, इस मामले में उत्तर पिछले मामले के समान है - strlcpy
।
या आप malloc
का उपयोग कर स्मृति आवंटित कर सकते हैं। यदि आपके द्वारा आवंटित स्मृति की मात्रा स्ट्रिंग के लिए पर्याप्त होने की गारंटी है (यानी कम से कम strlen(src_str) + 1
बाइट आवंटित किए गए हैं), तो आप स्ट्रिंग की प्रतिलिपि बनाने के लिए सादे strcpy
या memcpy
का उपयोग कर सकते हैं। इस मामले में strlcpy
का उपयोग करने की कोई आवश्यकता नहीं है और कोई कारण नहीं है, हालांकि कुछ लोग इसका उपयोग करना पसंद कर सकते हैं, क्योंकि यह किसी भी तरह उन्हें अतिरिक्त सुरक्षा की भावना देता है।
यदि आप जानबूझकर कम स्मृति आवंटित करते हैं (यानी आप अपनी स्ट्रिंग को छोटा करना चाहते हैं), तो strlcpy
उपयोग करने के लिए सही कार्य बन जाता है।
धन्यवाद। जब आप कहते हैं कि "जब आप शून्य-समाप्त तारों के साथ काम कर रहे हों तो strncpy सही जवाब नहीं है", तो आपका मतलब स्रोत स्ट्रिंग या dest? – hari
@hari: गंतव्य स्ट्रिंग। 'strncpy' एक * रूपांतरण * फ़ंक्शन है, जो शून्य-समाप्त स्रोत स्ट्रिंग को एक गैर-समाप्तिित निश्चित-चौड़ाई लक्ष्य स्ट्रिंग में परिवर्तित करता है। – AnT
तो, यदि मेरी गंतव्य स्ट्रिंग 'char dst_arr [10] है, 'वह शून्य-समाप्त नहीं है। तो मुझे 'strlcpy' सही का उपयोग करना चाहिए? – hari