क्या सी में strncmp के लिए एक गैर-शून्य-समाप्त स्ट्रिंग पास करना कानूनी है?




standards standard-library (2)

मेरे पास 16 बाइट्स की एक सरणी है जो एक निष्पादन योग्य सेगमेंट का नाम रखती है।

char segname[16];

यदि सेगमेंट के नाम की लंबाई 16 बाइट्स से कम है, तो बाकी नल बाइट्स के साथ गद्देदार है। अन्यथा, कोई ख़त्म करने वाली अशक्त बाइट नहीं है।

मैं segname तुलना विभिन्न स्ट्रिंग्स से करना चाहता हूं, जैसे __text

क्या गैर-टर्मिनेटेड स्ट्रिंग के साथ strncmp को कॉल करना कानूनी है?

यह पोस्ट मानता है कि यह कानूनी है। यह सोर्स कोड इसे कानूनी भी बनाता है। लेकिन मेरे आदमी का पेज कहता है:

strncmp() फ़ंक्शन lexicographically null-terminated strings s1 और s2 तुलना करता है।

strncmp को दिया गया आकार segname का आकार होगा।

मैं सोच रहा हूं कि मुझे क्या उल्लेख करना चाहिए।


Strncmp फ़ंक्शन n2 वर्णों से अधिक नहीं है (वर्ण जो एक अशक्त वर्ण का अनुसरण नहीं करते हैं) s2 द्वारा इंगित सरणी से s1 द्वारा इंगित किए गए सरणी से हैं।

विशिष्टता 7.24.4.2 कहती है कि। C11 मानक।

वर्ण जो शून्य वर्णक का पालन नहीं करते हैं, उनकी तुलना नहीं की जाती है, इसलिए यह अशक्त वर्ण वर्ण या स्ट्रिंग की अपेक्षा करता है। 1

आप यहां गैर-शून्य समाप्त वर्णों का भी उपयोग कर सकते हैं, लेकिन उस स्थिति में हमें लंबाई निर्दिष्ट करनी होगी, जिसे हमें यह जांचना होगा कि यह कुछ मामलों में उपयोगी है।

सुधार

[१] जो पात्र अशक्त चरित्र का पालन नहीं करते हैं, उनकी तुलना नहीं की जाती है, इसका मतलब यह नहीं है कि strncmp शून्य-समाप्त स्ट्रिंग्स की अपेक्षा करता है। इसका मतलब सिर्फ इतना है कि strncmp को एक विशेष मामले की जरूरत है ताकि (उदाहरण के लिए) कहा जा सके कि abc\0def ... और abc\0xyz ... बराबर की तुलना करें। दो चार सरणियों की तुलना करने में कुछ भी गलत नहीं है, जो शून्य-निर्दिष्ट नहीं हैं (निर्दिष्ट लंबाई तक) या एक शून्य समाप्त किए गए चार सरणी की तुलना एक शून्य से समाप्त नहीं हुई है।
यह सीधे डेविड हैमेन की टिप्पणी से जोड़ा गया है


C99 मानक के अनुसार, खंड 7.21.4.4, .3।, यह कानूनी है:

strncmp फ़ंक्शन एक पूर्णांक से अधिक, शून्य के बराबर, या शून्य से कम रिटर्न देता है, तदनुसार s1 द्वारा इंगित संभवतः शून्य-समाप्त सरणी, s2 से इंगित किए गए संभवतः शून्य-समाप्त सरणी से अधिक या उससे कम है।

हालाँकि, सूचना है कि यह वर्णों की सरणी कहती है। परिभाषा के अनुसार, यदि वर्णों का एक सरणी शून्य-समाप्त नहीं है, तो यह एक स्ट्रिंग नहीं है।







strncmp