2014-06-28 10 views
10

अन्य सी लाइब्रेरी फ़ंक्शन के रूप में, strcpy, strcat की तरह, एक संस्करण है जो स्ट्रिंग के आकार को सीमित करता है (strncpy, आदि), मुझे आश्चर्य है कि strchr के लिए ऐसा कोई संस्करण क्यों नहीं है?कोई स्ट्रंच फ़ंक्शन क्यों नहीं है?

+3

आप यह क्यों की आवश्यकता होगी? 'Memchr()' ऐसा नहीं करता है जो 'strnchr() 'करेगा? –

+2

@ जोनाथन लेफ्लर संभवतः 'strnchr()' टर्मिनेटर हिट होने पर एक बार रोक देगा * या * अधिकतम लंबाई हिट हुई थी। 'strchr_s' एक बेहतर नाम हो सकता है। लेकिन निश्चित रूप से यदि आपके डेटासेट में एक अतिप्रवाह स्ट्रिंग है, तो आप पहले ही खो चुके हैं। – Sneftel

+1

@ स्नीफ्टेल: हम्म ... दिलचस्प ... यदि आपको नहीं पता कि नल समाप्त होने वाली स्ट्रिंग कितनी देर तक है लेकिन पता है कि यह एन बाइट्स से अधिक नहीं है, और आप केवल पहले एम बाइट्स को सबसे अधिक खोजने में रुचि रखते हैं, और एम <एन , लेकिन शून्य-समाप्ति वाली स्ट्रिंग की वास्तविक लंबाई, एल, एम से कम हो सकती है, फिर 'memchr() 'hypothetical' strnchr() 'के समान नहीं है। वैध, भले ही बहुत संभावना न हो। –

उत्तर

15

यह मौजूद है - यह memchr कहा जाता है:

http://en.wikipedia.org/wiki/C_string_handling

+1

ध्यान दें कि 'memchr' * exacly * क्या हो सकता है कि 'strnchr' क्या कर सकता है, क्योंकि' memchr' स्ट्रिंग के अंत में नहीं रुकता है यदि यह' n' तर्क से छोटा है (यानी यह बाइट्स पढ़ सकता है 'strchr' के विपरीत' \ 0' से परे)। 'Memchr' के बराबर" n-less "समतुल्य नहीं है, लेकिन 'rawmemchr', एक जीएनयू एक्सटेंशन जो POSIX और न ही C99 है। – anol

+1

तो '# परिभाषित करें strnchr (घास, सुई, लंबाई) memchr (घास, सुई, strnlen (घास, लंबाई)) 'यह करना चाहिए, है ना? –

7

सी में, "स्ट्रिंग" शब्द का अर्थ आम तौर पर "वर्णों की शून्य समाप्ति सरणी" का अर्थ है, और str* फ़ंक्शंस उन प्रकार के तारों पर काम करता है। आपके द्वारा उल्लेख किए गए कार्यों में n अधिकतर आउटपुट को नियंत्रित करने के लिए अधिकतर है।

यदि आप किसी भी निहित समाप्ति अर्थशास्त्र के बिना एक आर्बिटरी बाइट अनुक्रम पर काम करना चाहते हैं, तो mem* कार्यों के परिवार का उपयोग करें; आपके मामले में memchr आपकी आवश्यकताओं को पूरा करना चाहिए।

+0

अच्छी अंतर्दृष्टि, लेकिन मौजूदा कार्यक्षमता के उदाहरण जहां इनपुट स्ट्रिंग के लिए बाध्य प्रदान किया जाता है 'strncmp() 'और' printf ("%। * S", n, s); '। ध्यान दें कि 'strncmp' के लिए एक उचित मैनपेज यह कहने से बचना होगा कि यह तर्क के रूप में तार लेता है, लेकिन बीएसडी और जीएनयू मैनपेज इस संबंध में थोड़ी गड़बड़ी कर रहे हैं। दूसरी तरफ सी मानक पूरी तरह से शब्द है। –

+0

इसके अलावा पॉज़िक्स की 'strnlen() '। –

+0

@ पास्कल क्यूक: दिलचस्प। मैं शायद किसी भी एल्गोरिदम पर दो बार देखता हूं जो 'strnlen' के लिए एक अच्छा उपयोग केस होने का आरोप लगाता है। –

संबंधित मुद्दे