दिलचस्प पोस्ट
एक वन-टू-रिलेशन ऑफ़ आलसी बनाना क्या कोई "पिछला भाई" सीएसएस चयनकर्ता है? क्या आप एक्सटेंशन से क्रोम: // पृष्ठों तक पहुंच सकते हैं? कारकों से लेकर अक्षर तक डेटा.फ्रेम कॉलम कन्वर्ट करें एक नया संग्रह करने के लिए स्ट्रीम करने के लिए संग्रह जावा में स्ट्रिंग को JSONObject में कैसे परिवर्तित किया जाए डिबग मोड के लिए एंड्रॉइड स्टूडियो में एसएचए -1 फिंगरप्रिंट सर्टिफिकेट कैसे प्राप्त करें? IPhone 6 और 6 प्लस पर ऐप्स के लिए मूल समाधान कैसे सक्षम करें? जावा में इंटरफेस नामकरण वेबसाइट पर कुछ गैर मानक फ़ॉन्ट कैसे जोड़ सकते हैं? गिट और ड्रॉपबॉक्स का प्रयोग एक साथ प्रभावी रूप से? मेरे AJAX आवेदन में वापस बटन पर कॉल को रोकना: मैं यह कुछ नहीं करना चाहता हूँ! एक HTML फ़ाइल में एक और HTML फ़ाइल शामिल करें एफ़टीपी / एसएफटीपी एक अमेज़ॅन एस 3 बाल्टी एक्सेस एजेएक्स संचालित साइट पर सही नियंत्रण को चुनना और सक्रिय करना

सी स्ट्रिंग – समता के लिए दो स्ट्रिंग्स की तुलना करने के लिए समानता ऑपरेटर == का उपयोग करना

int main (int argc, **argv) { if (argv[1] == "-hello") printf("True\n"); else printf("False\n"); } 
 # ./myProg -hello
 असत्य

क्यूं कर? मुझे पता है कि strcmp(argv[1], "-hello") == 0 रिटर्न सही है … लेकिन मैं दो सी स्ट्रिंग्स की तुलना करने के लिए समानता ऑपरेटर का उपयोग क्यों नहीं कर सकता?

वेब के समाधान से एकत्रित समाधान "सी स्ट्रिंग – समता के लिए दो स्ट्रिंग्स की तुलना करने के लिए समानता ऑपरेटर == का उपयोग करना"

क्योंकि argv[1] (उदाहरण के लिए) वास्तव में स्ट्रिंग के लिए एक सूचक है। तो आप जो भी कर रहे हैं वह संकेतक की तुलना कर रहा है

आप == के साथ सी में स्ट्रिंग्स की तुलना नहीं कर सकते हैं, क्योंकि सी कंपाइलर स्ट्रिंग-शब्दशः परे स्ट्रिंग्स के बारे में वास्तव में कोई सुराग नहीं करता है।

कंपाइलर किसी भी ओर एक char* साथ एक तुलना देखता है, तो यह एक सूचक तुलना करता है (जो पतों में संग्रहीत पतों की तुलना करता है)

C , क्योंकि अधिकांश संदर्भों में, एक सरणी "अपने पहले तत्व के लिए एक संकेतक में क्षय" होता है।

इसलिए, जब आपके पास "foobar" सरणी है और इसे सबसे अधिक संदर्भों में उपयोग करते हैं, तो यह एक संकेतक में क्षय हो जाता है:

 if (name == "foobar") /* ... */; /* comparing name with a pointer */ 

क्या आप इसे कुछ के साथ सरणी की सामग्री की तुलना करना चाहते हैं आप मैन्युअल रूप से ऐसा कर सकते हैं

 if ('p' == *("foobar")) /* ... */; /* false: 'p' != 'f' */ if ('m' == *("foobar"+1)) /* ... */; /* false: 'm' != 'o' */ if ('g' == *("foobar"+2)) /* ... */; /* false: 'g' != 'o' */ 

या स्वचालित रूप से

 if (strcmp(name, "foobar")) /* name is not "foobar" */; 

क्योंकि सी स्ट्रिंग जैसी कोई चीज नहीं है।

सी में, एक स्ट्रिंग आमतौर पर चारों की एक सरणी होती है, या चारों ओर एक सूचक (जो लगभग एक ही है)। एक कॉन्फ़्रर सरणी के लिए सूचक / सरणी की तुलना करना अपेक्षित परिणाम नहीं देगा।

अद्यतनः 'सी सी स्ट्रिंग' का मतलब क्या है, सी में कोई स्ट्रिंग नहीं है। आमतौर पर जिसे 'सी स्ट्रिंग' के रूप में संदर्भित किया जाता है वह भाषा स्वतंत्र है ('पास्कल स्ट्रिंग' के रूप में), यह स्ट्रिंग का प्रतिनिधित्व शून्य के रूप में है वर्णों की समाप्ति वाली रैखिक सरणी

सी में, स्ट्रिंग मान (स्ट्रिंग लीटरल समेत) को एक टर्मिनेटर के char अक्षों के सरणी के रूप में प्रस्तुत किया जाता है, और आप सरणी सामग्री की तुलना करने के लिए == ऑपरेटर का उपयोग नहीं कर सकते हैं; भाषा केवल ऑपरेशन को परिभाषित नहीं करती है

सिवाय इसके कि जब यह sizeof या ऑपरेटरों का संचालन होता है या जब यह एक स्ट्रिंग है जिसे एक घोषणा में एक और अरैम को प्रारंभ करने के लिए इस्तेमाल किया जाता है, तो "एन-तत्व एरे के प्रकार" के साथ एक अभिव्यक्ति के प्रकार को पूर्ण रूप से परिवर्तित किया जाएगा ( क्षय) टाइप करने के लिए "सूचक को टी में", और अभिव्यक्ति का मान सरणी के पहले तत्व का पता होगा।

तो जब आप लिखते हैं

 if (argv[1] == "-hello") 

कंपाइलर ने अभिव्यक्ति "-hello" को "-hello" 7-तत्व सरणी" से "पॉइंटर टू कोअर" ( argv[1] पहले से ही एक सूचक प्रकार) से बदल दिया है, और अभिव्यक्ति का मूल्य वर्ण का पता है '-' तो क्या == हवाओं की तुलना दो संकेतक मूल्य हैं, जो कि (सबसे अधिक संभावना) "-hello" और argv[1] (सबसे अधिक संभावना) मेमोरी में विभिन्न क्षेत्रों पर कब्जा करने के बाद से बराबर नहीं होने वाला है।

यही कारण है कि आपको स्ट्रिंग मानों की तुलना करने के लिए पुस्तकालय फ़ंक्शन जैसे strcmp() का उपयोग करना है

क्योंकि सी स्ट्रिंग्स मौजूद नहीं हैं वे एक \0 में समाप्त होने वाले चार सरणी हैं

समानता ऑपरेटर == यह जांच करेगा कि सरणी के पहले तत्व के सूचक को एक समान है। यह शब्दार्थिक रूप से तुलना नहीं करता है

दूसरी ओर "-hello" == "-hello" गैर शून्य लौटा सकता है, लेकिन इसका अर्थ यह नहीं है कि == ऑपरेटर "-hello" == "-hello" तुलना करता है। यह अन्य तथ्यों के कारण है

यदि आप लेक्सोग्राफीसीली की तुलना करना चाहते हैं, तो आप हमेशा भी कर सकते हैं

 #define STR_EQ(s1,s2) \ strcmp(s1,s2) == 0 

कठिन पढ़ना मैं देख रहा हूँ कि आप c ++ के रूप में टैग किए हैं तो आप कर सकते हैं

  std::string arg1 ( argv[1] ); if (arg1 == "-hello"){ // yeahh!!! } else{ //awwwww } 

स्ट्रिंग्स मूल प्रकार नहीं हैं सी में। क्या आप उस उदाहरण की तुलना कर रहे हैं दो पॉइंटर्स हैं एक अपने पहले तर्क के लिए, और दूसरी "हेलो" की सामग्री के साथ एक स्थिर चरित्र सरणी है

तुम सच में strncmp या कुछ इसी तरह का उपयोग करना चाहते हैं।

जब आप == का उपयोग कर रहे हैं, तो आप पॉइंटर्स की तुलना कर रहे हैं यही है, यह सत्य वापस लौटाएगा यदि दो ऑपरेटर्स स्मृति में समान स्ट्रिंग देखें। इसलिए, स्ट्रिंग्स की तुलना में शब्दसंगत रूप से तुलना करने में उपयोग के लिए यह अनुपयोगी है

क्योंकि सी स्ट्रिंग वर्णों की सरणी हैं एरेरे सरणी में पहले तत्व के संकेत हैं, और जब आप == का प्रयोग करते हुए दो पॉइंटर्स की तुलना करते हैं, तो वह उन मेमोरी पते की तुलना करता है, जो वे इंगित करते हैं, उनके मूल्यों को इंगित नहीं करते हैं।