2012-02-03 15 views
5

तो मुझे एक दुविधा है। मैं दो सी-शैली तार की तुलना करने की जरूरत है और मैं कार्यों है कि सबसे अधिक उपयुक्त होगा के लिए खोज:दो सी-शैली तारों की तुलना करने के लिए उचित कार्य क्या है?

memcmp //Compare two blocks of memory (function) 
strcmp //Compare two strings (function) 
strcoll //Compare two strings using locale (function) 
strncmp //Compare characters of two strings (function) 
strxfrm //Transform string using locale (function) 

पहले एक मुझे लगता है कि पतों के लिए है, इसलिए विचार बाहर है। दूसरा मुझे सबसे अच्छा विकल्प पसंद करता है, लेकिन मैं वैसे भी प्रतिक्रिया सुनना चाहता हूं। अन्य तीन मुझे अनजान छोड़ देते हैं।

+0

* "पहला मुझे लगता है कि पते के लिए है" * - नहीं, यह स्मृति के मनमानी ब्लॉक के लिए है। अंत में उन सभी कार्यों की तुलना मेमोरी ब्लॉक को इंगित करने वाले पते लेती है। लेकिन वास्तव में कोई भी पते की तुलना नहीं करता है। लेकिन आपकी इन-कोड टिप्पणियों से मुझे लगता है कि आप इसके बारे में जानते हैं और खुद को थोड़ा गलत तरीके से व्यक्त किया है। –

उत्तर

19

सामान्य स्ट्रिंग तुलना के लिए, strcmp उचित कार्य है। स्मृति के ब्लॉक की तुलना करने के लिए आपको स्ट्रिंग से कुछ वर्णों की तुलना करने के लिए strncmp का उपयोग करना चाहिए (उदाहरण के लिए, एक उपसर्ग), और memcmp

यह कहा गया है, चूंकि आप सी ++ का उपयोग कर रहे हैं, तो आपको इसे पूरी तरह से टालना चाहिए और std::string कक्षा का उपयोग करना चाहिए, जो सी-स्टाइल स्ट्रिंग्स से अधिक आसान और सामान्य रूप से सुरक्षित है। == ऑपरेटर का उपयोग करके आप समानता के लिए दो std::string एस की तुलना कर सकते हैं।

आशा है कि इससे मदद मिलती है!

+0

धन्यवाद, मुझे अच्छा लगेगा, लेकिन अभी के लिए हमारे प्रोफेसर हमें सी स्ट्रिंग्स का उपयोग करने के लिए प्रतिबंधित कर रहे हैं। – Yokhen

+0

सी प्लस फ़ंक्शन कोड की जांच करें और इसे पढ़ें ... शायद आपको एक आश्चर्य मिलेगा।, और @templatetypedef मुझे लगता है कि == इस मामले में rite ऑपरेटर नहीं है imho। – crsuarezf

+0

@ ingcarlos- आप सही हैं कि आपको यहां == का उपयोग नहीं करना चाहिए। मेरा सुझाव है कि C++ की std :: स्ट्रिंग पर स्विच करना है, जिस स्थिति में == ऑपरेटर जाने का तरीका है। – templatetypedef

3

memcmp और strcmp दोनों ठीक काम करेंगे। पूर्व का उपयोग करने के लिए, आपको पहले से छोटी स्ट्रिंग की लंबाई जाननी होगी।

+2

यदि आप पूर्व स्ट्रिंग की लंबाई के साथ 'memcmp' कहते हैं, तो यह आपको बताएगा कि' abc "' और 'abcdef" बराबर हैं। आप इसे छोटी स्ट्रिंग प्लस वन की लंबाई पारित कर सकते हैं (और यह '' \ 0 'टर्मिनेटर को देख और तुलना करेगा) - लेकिन चूंकि' strcmp' विशेष रूप से तारों की तुलना करने के लिए डिज़ाइन किया गया है, यही आपको उपयोग करना चाहिए। –

+0

मैं उन सभी के साथ सहमत हूं, हाँ। –

+0

कोई भी जानता है कि 'memcmp' तेजी से हो सकता है, पहले की लंबाई जानने के कारण कहें और इसलिए पहले उदाहरण में शब्द लंबाई भाग को देखकर कुछ अनुकूलन की अनुमति दे रही है? – Keith

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