2009-11-23 16 views
25

मैं स्रोत कोड की निम्न बहुत बहुत ही सरल टुकड़ा संकलित करने के लिए कोशिश कर रहा हूँ:जी ++ त्रुटि: 'stricmp' इस दायरे में घोषित किया गया था (लेकिन 'strcmp' के लिए ठीक)

#include <cstring> 
// #include <string.h> 
// using namespace std; 

class Helper { 
public: 
    int cStringsAreEqual(const char *s1, const char *s2) { 
     return stricmp(s1, s2); 
    } 
}; 

... लेकिन मैं निम्नलिखित त्रुटि संदेश मिल रहा हूँ:

g++ error: ‘stricmp’ was not declared in this scope 

हालांकि जब मैं strcmp()के बजाय stricmp() का उपयोग तो सब कुछ ठीक है!

यहां क्या गलत हो सकता है? Strcmp() की अनुमति होने पर stricmp() की अनुमति नहीं दी जानी चाहिए?

Sureley, यह सब strcmp/stricmp का उपयोग किए बिना एक बेहतर तरीके से लिखा जा सकता है।

लेकिन यह बात यहां नहीं है।

मैं सॉफ्टवेयर का एक टुकड़ा पोर्ट कर रहा हूं - जो stricmp() को कॉल का अधिक उपयोग करता है। और यदि किसी भी तरह से संभव है तो मैं हर कॉल को stricmp में बदलने के लिए आवश्यक सभी प्रयासों से बचना चाहता हूं।

इस पर किसी भी मदद की बहुत सराहना की जाएगी!

बीटीडब्लू: मैं उबंटू कर्मिक ओएस (v9.10) का उपयोग कर रहा हूं g ++ v4.4.1 के साथ।

बीटीडब्ल्यू: जैसा कि आप देख सकते हैं कि मैंने '#cludclud string.h' या 'नेमस्पेस std' के साथ कुछ परीक्षण भी किए हैं लेकिन कुछ भी मदद नहीं की है।

+0

कि stricmp और strcmp ध्यान में रखते हुए ही नहीं हैं, तो आप उन्हें किसी भी तरह से बदलने से पहले hesistate करना चाह सकते हैं (उत्तरार्द्ध केस संवेदी है)। – Brian

+2

मुझे पता है कि वे एक जैसे नहीं हैं। यही कारण है कि मैं stricmp का उपयोग करना चाहता हूं और strcmp –

+0

नोट भी नोट करें कि '' और ' 'बिल्कुल कुछ नहीं हैं। यह आपकी समस्या का कारण नहीं है, लेकिन वैश्विक नामस्थान में नाम आयात किए जाने के बजाय आपको 'std :: strcmp' (या' std :: strcoll') लिखना होगा। –

उत्तर

34

strcasecmp() आज़माएं। इसके लिए manual page यहां है। यह 4.4BSD और POSIX.1-2001 के अनुरूप है।

+0

यह एक विकल्प होगा।strcasecmp() में एक ही पैरामीटर लगता है। तो एक छोटी सी पर्ल स्क्रिप्ट बनाने में मुश्किल नहीं होनी चाहिए जो वैश्विक परिवर्तन करता है। आपका बहुत बहुत धन्यवाद! –

+0

कोई समस्या नहीं है। मार्क रशकॉफ की टिप्पणी पर भी एक नज़र डालें कि लोकेल सेटिंग्स इस फ़ंक्शन को कैसे प्रभावित करती है। – Gonzalo

+1

सावधान रहें कि strcasecmp आपके लोकेल पर निर्भर करता है। इस प्रकार strcasecmp ("div", "DIV") एक तुर्की लोकेल में 0 वापस नहीं करेगा (लोअरकेस I ı) है। इसका मतलब यह है कि आपकी स्ट्रिंग कहां से आती है :-(। अन्य भाषाओं में अन्य उदाहरण भी हैं। आप अपने कार्यक्रम को विदेशी उपयोगकर्ताओं के लिए तोड़ सकते हैं। – rockdaboot

13

stricmp is neither POSIX nor ANSI, तो यह वास्तव में (के रूप में शायद जीसीसी सूट के साथ मामला है) अगर strcmp, की अनुमति दी है कि यदि आपके संकलक या मानक पुस्तकालय सख्ती से POSIX या एएनएसआई मानक पुस्तकालय कार्यों का पालन कर रहा है कोई फर्क नहीं पड़ता।

+0

एक ही अर्थशास्त्र के साथ एक POSIX/ANSI विकल्प है? –

+3

यह जटिल है, क्योंकि "केस-सेंसिटीविटी" का विचार आपके लोकेल या ओएस पर निर्भर हो सकता है। इस प्रश्न में कुछ उत्तरों देखें: http://stackoverflow.com/questions/11635/case-insensitive-string-comparison-in-c –

+0

मैं सिग्विन के साथ विंडोज 7 पर एक्लिप्स सीडीटी का उपयोग कर रहा हूं, और वहां स्ट्रिकंप स्वीकार किया जाता है। मेरी लिनक्स मशीन पर, जीसीसी के साथ इसे स्वीकार नहीं किया जाता है। क्या इसका मतलब है कि सिग्विन आईएस नहीं पॉज़िक्स या एएनएसआई के साथ संकलक शामिल है? –

10

प्लेटफार्मों पर strcasecmp के साथ stricmp को ओवरराइट करने के लिए इसके लिए एक परिभाषा जोड़ें।

#ifdef _IPHONE <- your platform define here 
#define stricmp strcasecmp 
#define strnicmp strncasecmp 
#endif 

फिर आप हमेशा स्ट्रिकम्प का उपयोग कर सकते हैं।

+0

मुझे एक ही त्रुटि थी और मैंने इसे सफलतापूर्वक हल किया। –

+0

हम इसे कहां रखते हैं –

+0

बस इसे किसी अन्य प्रीप्रोसेसर निर्देश (ifdefs/परिभाषित) के साथ शीर्ष पर या शीर्ष पर रखें: http://www.cplusplus.com/doc/tutorial/preprocessor/ #define _IPHONE शून्य से ऊपर के उपयोग पर स्विच करेगा " <- .. "भाग" –

-1

अपने स्वयं के बनाने के लिए यदि आवश्यकता हुई सुंदर आसान ...

int my_stricmp (const char *s1, const char *s2) 
{ 
    while (*s1 != 0 && *s2 != 0) 
    { 
     if (*s1 != *s2 && ::toupper (*s1) != ::toupper(*s2)) 
     { 
      return -1; 
     } 
     s1++; 
     s2++; 
    } 
    return (*s1 == 0 && *s2 == 0) ? 0 : -1; 
} 
+0

's2' के बाद' s1' प्रकार के बाद यह सकारात्मक मान कैसे लौटाता है? या क्या इसका उद्देश्य 'std :: strcmp()' –

+0

पर एक अलग इंटरफ़ेस होना है, संबोधित समस्या @TobySpeight इंगित किया गया। तर्क के साथ भी सही किया गया। –

+1

'CAVEAT':' :: toupper' पर कॉल लोकेल विशिष्ट हैं। आप इसे कहां चलाते हैं इसके आधार पर आपको अलग-अलग परिणाम मिल सकते हैं। लोकेल जागरूक ओवरराइड का उपयोग करने पर विचार करें बजाय। –

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