जवाबों:
इसका मतलब नहीं मिला।
इसे आमतौर पर इस तरह परिभाषित किया जाता है:
static const size_t npos = -1;
-1 के बजाय npos की तुलना करना बेहतर है क्योंकि कोड अधिक सुपाठ्य है।
cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;
और प्राप्त करता pos:4294967295 npos: 4294967295
हूं जब मैं इसे विंडोज में चलाता हूं, लेकिन मैक पर मुझे मिलता है pos:4294967295 npos: 18446744073709551615
। यह सही नहीं लगता है ... अच्छी तरह से किसी भी तरह से मैं के -1
बजाय की तुलना करने का सुझावstd::string::npos
string::npos
एक निरंतर (शायद -1
) एक गैर-स्थिति का प्रतिनिधित्व करता है। यह पद्धति द्वारा वापस आ गया है find
जब पैटर्न नहीं मिला था।
दस्तावेज़ string::npos
कहता है:
npos एक स्थिर सदस्य स्थिरांक मान है जिसका प्रकार size_t के तत्व के लिए सबसे बड़ा संभव मान है।
वापसी मूल्य के रूप में इसका उपयोग आमतौर पर विफलता को इंगित करने के लिए किया जाता है।
यह स्थिरांक वास्तव में -1 (किसी भी विशेषता के लिए) के मूल्य के साथ परिभाषित किया गया है, क्योंकि size_t एक अहस्ताक्षरित अभिन्न प्रकार है, इस प्रकार के लिए सबसे बड़ा संभव प्रतिनिधित्व योग्य मूल्य बन जाता है।
size_t
एक अहस्ताक्षरित चर है, इस प्रकार 'अहस्ताक्षरित मूल्य = - 1' स्वचालित रूप से इसके लिए सबसे बड़ा संभव मूल्य बनाता है size_t
: 18446744073709551615
std::string::npos
कार्यान्वयन परिभाषित सूचकांक है जो हमेशा किसी भी std::string
उदाहरण की सीमा से बाहर होता है । विभिन्न std::string
कार्य इसे वापस करते हैं या इसे स्ट्रिंग स्थिति के अंत से परे संकेत करने के लिए स्वीकार करते हैं। यह आमतौर पर कुछ अहस्ताक्षरित पूर्णांक प्रकार का होता है और इसका मूल्य आमतौर पर std::numeric_limits<std::string::size_type>::max ()
होता है (मानक पूर्णांक पदोन्नति के लिए धन्यवाद) आमतौर पर तुलनीय होता है -1
।
हमें string::size_type
खोज फ़ंक्शन के वापसी प्रकार के लिए उपयोग करना होगा अन्यथा तुलना के साथ string::npos
काम नहीं हो सकता है।
size_type
, जो स्ट्रिंग के आवंटनकर्ता द्वारा परिभाषित किया गया है, एक unsigned
अभिन्न प्रकार होना चाहिए । डिफ़ॉल्ट संभाजक, संभाजक, का उपयोग करता है टाइप size_t
के रूप में size_type
। क्योंकि -1
एक अहस्ताक्षरित अभिन्न प्रकार में परिवर्तित हो जाता है, npos इसके प्रकार का अधिकतम अहस्ताक्षरित मान है। हालांकि, सटीक मान प्रकार की सटीक परिभाषा पर निर्भर करता है size_type
। दुर्भाग्य से, ये अधिकतम मूल्य भिन्न हैं। वास्तव में, 1 (unsigned long)-1
से भिन्न होता है (unsigned short)-
यदि प्रकार का आकार भिन्न होता है। इस प्रकार, तुलना
idx == std::string::npos
गलत हो सकता है अगर idx का मान -1
और idx है और string::npos
विभिन्न प्रकार हैं:
std::string s;
...
int idx = s.find("not found"); // assume it returns npos
if (idx == std::string::npos) { // ERROR: comparison might not work
...
}
इस त्रुटि से बचने का एक तरीका यह है कि खोज सीधे विफल हो जाए या नहीं:
if (s.find("hi") == std::string::npos) {
...
}
हालांकि, अक्सर आपको मिलान चरित्र स्थिति के सूचकांक की आवश्यकता होती है। इस प्रकार, एक और सरल उपाय यह है कि npos के लिए अपने स्वयं के हस्ताक्षरित मूल्य को परिभाषित करें:
const int NPOS = -1;
अब तुलना कुछ अलग और अधिक सुविधाजनक लगती है:
if (idx == NPOS) { // works almost always
...
}
npos केवल एक टोकन मूल्य है जो आपको बताता है कि खोज () में कुछ भी नहीं मिला (शायद -1 या ऐसा कुछ)। खोज () पैरामीटर की पहली घटना के लिए जाँच करता है, और उस सूचकांक को लौटाता है जिस पर पैरामीटर शुरू होता है। उदाहरण के लिए,
string name = "asad.txt";
int i = name.find(".txt");
//i holds the value 4 now, that's the index at which ".txt" starts
if (i==string::npos) //if ".txt" was NOT found - in this case it was, so this condition is false
name.append(".txt");
स्थिर कास्ट size_t npos = -1;
Size_t का अधिकतम मूल्य
npos एक स्थिर सदस्य स्थिरांक मान है जिसका प्रकार size_t के तत्व के लिए सबसे बड़ा संभव मान है।
यह मान, जब स्ट्रिंग के सदस्य कार्यों में एक लेन (या सबलेन) पैरामीटर के लिए मान के रूप में उपयोग किया जाता है, का अर्थ है "स्ट्रिंग के अंत तक"।
वापसी मूल्य के रूप में, इसका उपयोग आमतौर पर बिना किसी मैच के संकेत देने के लिए किया जाता है।
यह स्थिरांक -1 के मान से परिभाषित किया गया है, क्योंकि size_t एक अहस्ताक्षरित अभिन्न प्रकार है, यह इस प्रकार के लिए सबसे बड़ा संभव प्रतिनिधित्व योग्य मूल्य है।
सी ++ 17 के इन दिनों के लिए एक उत्तर, जब हमारे पास है std::optional
:
आप थोड़ा और नाटक भेंगापन, तो std::string::find()
रिटर्न एक std::optional<std::string::size_type>
(जो यह तरह होना चाहिए की ...) - तो हालत हो जाता है:
auto position = str.find(str2);
if ( position.has_value() ) {
std::cout << "first 'needle' found at: " << found.value() << std::endl;
}
स्ट्रिंग का मान :: npos 18446744073709551615 है। यदि कोई स्ट्रिंग नहीं मिली है तो इसका मान वापस आ गया।
18446744073709551615
64-बिट के लिए विशिष्ट होगा std::size_t
, यह अधिकतम 64-बिट अहस्ताक्षरित मूल्य है।