दिलचस्प पोस्ट
बूलियन, सशर्त ऑपरेटर्स और ऑटोबॉक्सिंग ठीक से एक सूची से एक पूर्णांक निकालें <पूर्णांक> Regexes में एक शब्द सीमा क्या है? रेलवे कंसोल से डिवाईज का उपयोग करने वाले उपयोगकर्ता में साइन इन कैसे करें? मैं खिड़की से एक पाठ चयन कैसे लपूं? गेट से चयन ()। GetRangeAt (0) एक html टैग के साथ? PHP में फ़ाइल की सामग्री-प्रकार कैसे प्राप्त करें? DOM नोड्स को सॉर्ट करने का सबसे आसान तरीका? दूसरे स्टोरीबोर्ड पर सेगू? मेमोरी प्रबंधन, हीप भ्रष्टाचार और सी ++ का दो divs, एक निश्चित चौड़ाई, दूसरे, बाकी इकाई ढांचा में बल्क डालें प्रदर्शन को सुधारना हनोई के टॉवर: पुनरावर्ती अल्गोरिदम एचटीएमएल को लगता है कि "चॉकनोरिस" एक रंग क्यों है? कैसे एक स्थिर समारोह का परीक्षण करने के लिए मुझे एक अनंत लूप क्यों मिलता है अगर मैं किसी संख्या के बजाय एक अक्षर दर्ज करता हूं?

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

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 या कुछ इसी तरह का उपयोग करना चाहते हैं।

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

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