2012-02-20 13 views
5

मेरे पास एक बफर है (उदा। char buffer[1024]) जो कुछ डेटा से भरा हो जाता है। अब मैं इस बफर में एक सबस्ट्रिंग खोजना चाहता हूं। चूंकि यह एक मामूली खोज होनी चाहिए, इसलिए मैं boost::algorithm::ifind_first का उपयोग कर रहा हूं।बूस्ट find_first यह कैसे काम करता है?/एक श्रेणी को परिभाषित करें

तो मैं इस तरह फ़ंक्शन को कॉल करें:

boost::iterator_range<char*> buf_iterator; 
buf_iterator = boost::algorithm::ifind_first(buffer ,"substring"); 

यह वास्तव में ठीक काम करता है। लेकिन मेरी चिंता निम्न है:

मैं फ़ंक्शन को केवल char pointer पास करता हूं, इसलिए ifind_first को पता नहीं होना चाहिए कि मेरा बफर कहां समाप्त होता है, लेकिन यह अभी भी काम करता है।

अब मेरा पहला विचार यह था कि फ़ंक्शन स्ट्रिंग-टर्मिनेशन वर्ण तक खोज करता है। लेकिन Boost Documentation में समारोह इस तरह परिभाषित किया गया है:

template<typename Range1T, typename Range2T> 
    iterator_range< typename range_iterator<Range1T>::type > 
    find_first(Range1T & Input, const Range2T & Search); 

चूंकि यह टेम्पलेट मानकों के साथ काम करता है मैं वास्तव में संदेह है कि यह अशक्त समाप्ति के साथ काम कर रहा है?

तो मेरा सवाल यह है कि ifind_first कैसे पता चलेगा? या अधिक सटीक होने के लिए, मैं इसे एक सीमा कैसे दे सकता हूं? जैसा कि पहले से ही उल्लेख किया गया है, यह char* के साथ ठीक काम करता है लेकिन मुझे पूरा यकीन नहीं है कि मैं केवल भाग्यशाली नहीं था - मेरा मतलब है कि सबसे बुरे मामले में फ़ंक्शन कहा जाता है और यह नहीं पता कि कहां रुकना है और अपरिभाषित स्मृति में जाना है .. ।

संपादित करें:

अब एक जवाब में उल्लेख किया गया था कि यह प्रकार मैं कार्य करने के लिए पारित पर निर्भर करता है। अब इसका मतलब यह होगा कि अगर मैं char बफर के साथ काम करता हूं तो मुझे हमेशा यह सुनिश्चित करना होगा कि यह 0-समाप्त हो गया है ...?

+0

यदि दस्तावेज़ इस विधि को बताते हैं तो यह बहुत अच्छी तरह छुपा हुआ है! – CapelliC

+0

कृपया अपनी पोस्ट पर हस्ताक्षर नहीं करें। –

उत्तर

5

यह एक तकनीक जहां एक सरणी की लंबाई एक टेम्पलेट तर्क है, यानी उपयोग करता है:

template< typename T, size_t L > 
void foo(T (&arr)[L]) 
{ 
} 

एक स्ट्रिंग शाब्दिक रूप में जाना जाता लम्बाई L ऐसे foo के रूप में, निष्कर्ष निकाला जा सकता है है ("परीक्षण") foo किया जा रहा है < चार, 5>()। मैं शर्त लगाता हूं कि कॉन्स char के लिए एक अधिभार है * जहां यह माना जाता है कि तर्क एक सी-स्ट्रिंग है, जहां लंबाई निर्धारित करने के लिए strlen() का उपयोग किया जा सकता है।

संपादित करें: बेहतर स्पष्टीकरण प्रदर्शन ifind_first कैसे विफल हो जाएगा, और क्यों यह नहीं है अगर आप सावधान

क्या है कि क्या ifind_first असफल या नहीं होगा इस मामले में चाहे या तो विषय है या उसने खोज में घिनौना फैसला करता हो जाएगा एक char *। इस मामले में आपने सीधे खोज के रूप में एक स्ट्रिंग शब्दकोष पारित कर दिया है, ifind_first कोशिश करेगा और अनुमान लगाएगा कि यह कॉन्स char [10] (नल टर्मिनेटर के लिए "substring" + 1 की लंबाई) है। हालांकि, खोज के लिए इससे कोई फर्क नहीं पड़ता, क्योंकि अगर यह चारों ओर स्थिर हो जाता है * ifind_first अनुमान लगाएगा कि यह एक पूर्ण समाप्त सी स्ट्रिंग है, और एक स्ट्रिंग शाब्दिक एक पूर्ण समाप्त सी सी स्ट्रिंग है जो वहां काम करता है।

इस मामले में आप वास्तव में चार बफर [1024] के लिए पूछ रहे हैं, आपके मामले में यह char * में खराब नहीं होता है। लेकिन अगर आप चाहते थे तो char * buffer = new char [1024] कहें; बफर का प्रकार चार * है और यह पूर्ण समाप्त होने की गारंटी नहीं है। इस मामले में ifind_first आपके द्वारा भरे क्षेत्र के बाद क्या है इसके आधार पर रहस्यमय तरीके से विफल हो जाएगा।

तो, निष्कर्ष निकालने के लिए, क्योंकि बफर का प्रकार char [1024] आपके मामले में यह बफर के अंत से पहले स्मृति को स्पर्श नहीं करेगा, लेकिन यह भी परवाह नहीं करेगा कि वहां कोई नल टर्मिनेटर है या नहीं इसकी तलाश नहीं है, क्योंकि आपने इसे एक चार पारित कर दिया है [1024] यह संकलन समय पर लंबाई जानता है)। इसलिए यदि आप कहते हैं कि आप 12 वर्णों के साथ बफर भरते हैं तो न्यूल के बाद भी यह पूरे बफर को खोजेगा।

+0

यह स्पष्ट नहीं करता है कि ऐसा लगता है कि यह गैर-शून्य समाप्त 'char' बफर के साथ क्यों काम कर रहा है, जहां' strlen() 'मदद नहीं करेगा। – nabulke

+0

तो इसका मतलब है उदाहरण के लिए: यदि मेरे पास 1024 बाइट्स वाला बफर है तो मुझे अपने बफर को 'चार बफर [1025] = {0}' के साथ प्रारंभ करना चाहिए, इसलिए मैं सुनिश्चित करता हूं कि यह ** ** ** निरस्त समाप्त हो (यहां तक ​​कि जब मुझे प्राप्त होता है बिल्कुल 1024 बाइट्स) ...? – Toby

+0

@nabulke: नहीं, चार बफर [1024] निश्चित आकार है, यह char * नहीं है (हालांकि यदि आप सावधान नहीं हैं तो यह char * में खराब हो सकता है)। Buf_iterator = boost :: एल्गोरिदम :: ifind_first ((char *) बफर, "substring" आज़माएं); – Ylisar