मैं वर्तमान में सी में लिखी एक लाइब्रेरी पर काम कर रहा हूँ। इस लाइब्रेरी के कई कार्यों में char*
या const char*
उनके तर्कों में एक स्ट्रिंग की उम्मीद है । मैंने उन कार्यों के साथ शुरुआत की, जो हमेशा स्ट्रिंग की लंबाई की अपेक्षा करते हैं size_t
ताकि शून्य-समाप्ति की आवश्यकता न हो। हालाँकि, जब परीक्षण लिखते हैं, तो इसका लगातार उपयोग होता है strlen()
, जैसे:
const char* string = "Ugh, strlen is tedious";
libFunction(string, strlen(string));
उपयोगकर्ता को सही ढंग से समाप्त किए गए स्ट्रिंग्स पास करने के लिए भरोसा करने से कम सुरक्षित, लेकिन अधिक संक्षिप्त और (मेरी राय में) पठनीय कोड प्राप्त होगा:
libFunction("I hope there's a null-terminator there!");
तो, यहाँ समझदार अभ्यास क्या है? API का उपयोग करने के लिए और अधिक जटिल बनाएं, लेकिन उपयोगकर्ता को उनके इनपुट के बारे में सोचने के लिए मजबूर करें, या एक अशक्त-समाप्त स्ट्रिंग के लिए आवश्यकता को दस्तावेज करें और कॉलर पर भरोसा करें?
CreateFile
एकLPTCSTR lpFileName
पैरामीटर लेता है । कॉलर से स्ट्रिंग की कोई लंबाई अपेक्षित नहीं है। वास्तव में, एनयूएल-टर्मिनेटेड स्ट्रिंग्स का उपयोग इतना उलझा हुआ है कि प्रलेखन में यह भी उल्लेख नहीं है कि फाइल का नाम एनयूएल-टर्मिनेटेड होना चाहिए (लेकिन निश्चित रूप से यह होना चाहिए)।