इस कोड में स्ट्रिंग :: npos का क्या अर्थ है?


91

std::string::nposकोड के निम्नलिखित स्निपेट में वाक्यांश का क्या अर्थ है?

found = str.find(str2);

if (found != std::string::npos)
    std::cout << "first 'needle' found at: " << int(found) << std::endl;

जवाबों:


105

इसका मतलब नहीं मिला।

इसे आमतौर पर इस तरह परिभाषित किया जाता है:

static const size_t npos = -1;

-1 के बजाय npos की तुलना करना बेहतर है क्योंकि कोड अधिक सुपाठ्य है।


3
तुलना करना == -1 कुछ लोगों को यह भी सोचने पर मजबूर कर सकता है कि वे <0 में बदल सकते हैं जो कि एक ही बात नहीं है और काम नहीं करेगा।
एंडी डेंट

बस सोच रहा था कि कोई भी इस पार आ गया है, या यह सिर्फ मैं हूं ... मैं इसे चलाता हूं cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;और प्राप्त करता pos:4294967295 npos: 4294967295हूं जब मैं इसे विंडोज में चलाता हूं, लेकिन मैक पर मुझे मिलता है pos:4294967295 npos: 18446744073709551615। यह सही नहीं लगता है ... अच्छी तरह से किसी भी तरह से मैं के -1बजाय की तुलना करने का सुझावstd::string::npos
user1135469

@ user1135469 आप के जवाब देखने अगर codaddict bellow ( stackoverflow.com/a/3827997/752842 ) या सेबस्टियन Raschka की, मुझे लगता है कि तुम क्या मतलब होगा हो रही है। और मैं npos का उपयोग करने की सिफारिश करूंगा, क्योंकि मैंने -1 का उपयोग करने की कोशिश की थी और यह उन परिस्थितियों में ठीक से काम नहीं कर रहा था जो मैं इसका उपयोग कर रहा था।
डेज़न

51

string::nposएक निरंतर (शायद -1) एक गैर-स्थिति का प्रतिनिधित्व करता है। यह पद्धति द्वारा वापस आ गया है findजब पैटर्न नहीं मिला था।


15
+1 वास्तव में npos = no-pos व्युत्पत्ति दिखाने के लिए जो इसे याद रखना आसान बनाता है। यह बहुत स्पष्ट है कि आप इसके बारे में एक बार सोच लेंगे, लेकिन यह जानने के बाद कि कोई व्यक्ति पहली बार उन पत्रों को देख रहा है या नहीं ...?
टोनी डेलरो सिप

4
47 के स्तर ... एनपीओ पर गलत size_t की है तो इसका मतलब यह नकारात्मक नहीं हो सकता ... असली अर्थ max_index, 18446744073709551615 64 बिट size_t के लिए है
NoSenseEtAl

25

दस्तावेज़ string::nposकहता है:

npos एक स्थिर सदस्य स्थिरांक मान है जिसका प्रकार size_t के तत्व के लिए सबसे बड़ा संभव मान है।

वापसी मूल्य के रूप में इसका उपयोग आमतौर पर विफलता को इंगित करने के लिए किया जाता है।

यह स्थिरांक वास्तव में -1 (किसी भी विशेषता के लिए) के मूल्य के साथ परिभाषित किया गया है, क्योंकि size_t एक अहस्ताक्षरित अभिन्न प्रकार है, इस प्रकार के लिए सबसे बड़ा संभव प्रतिनिधित्व योग्य मूल्य बन जाता है।


17

size_tएक अहस्ताक्षरित चर है, इस प्रकार 'अहस्ताक्षरित मूल्य = - 1' स्वचालित रूप से इसके लिए सबसे बड़ा संभव मूल्य बनाता है size_t: 18446744073709551615


size_t 32 बिट संकलक के लिए अहस्ताक्षरित int है; 64 बिट कंपाइलर के लिए अहस्ताक्षरित लंबा लंबा इंट .. इसे -1 पर सेट करने से उस अहस्ताक्षरित प्रकार की अधिकतम वैल होती है।
सुधीरब

9

std::string::nposकार्यान्वयन परिभाषित सूचकांक है जो हमेशा किसी भी std::stringउदाहरण की सीमा से बाहर होता है । विभिन्न std::stringकार्य इसे वापस करते हैं या इसे स्ट्रिंग स्थिति के अंत से परे संकेत करने के लिए स्वीकार करते हैं। यह आमतौर पर कुछ अहस्ताक्षरित पूर्णांक प्रकार का होता है और इसका मूल्य आमतौर पर std::numeric_limits<std::string::size_type>::max ()होता है (मानक पूर्णांक पदोन्नति के लिए धन्यवाद) आमतौर पर तुलनीय होता है -1


4

हमें 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
...
}

3

foundnposखोज स्ट्रिंग में विकल्प खोजने में विफलता के मामले में होगा ।


1
$21.4 - "static const size_type npos = -1;"

यह स्ट्रिंग फ़ंक्शंस द्वारा लौटाया गया है जो त्रुटि / नहीं मिला आदि को दर्शाता है।


0

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");

यह कोड "asad.other" के लिए नहीं होगा क्योंकि खोज () एक इंट वापस नहीं करता है।
लॉजिकमैजिक

0

स्थिर कास्ट size_t npos = -1;

Size_t का अधिकतम मूल्य

npos एक स्थिर सदस्य स्थिरांक मान है जिसका प्रकार size_t के तत्व के लिए सबसे बड़ा संभव मान है।

यह मान, जब स्ट्रिंग के सदस्य कार्यों में एक लेन (या सबलेन) पैरामीटर के लिए मान के रूप में उपयोग किया जाता है, का अर्थ है "स्ट्रिंग के अंत तक"।

वापसी मूल्य के रूप में, इसका उपयोग आमतौर पर बिना किसी मैच के संकेत देने के लिए किया जाता है।

यह स्थिरांक -1 के मान से परिभाषित किया गया है, क्योंकि size_t एक अहस्ताक्षरित अभिन्न प्रकार है, यह इस प्रकार के लिए सबसे बड़ा संभव प्रतिनिधित्व योग्य मूल्य है।


0

सी ++ 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;
}

0

स्ट्रिंग का मान :: npos 18446744073709551615 है। यदि कोई स्ट्रिंग नहीं मिली है तो इसका मान वापस आ गया।


वास्तविक मूल्य कार्यान्वयन और अप्रासंगिक है। व्यवहार में, हालांकि, मूल्य 1844674407370955161564-बिट के लिए विशिष्ट होगा std::size_t, यह अधिकतम 64-बिट अहस्ताक्षरित मूल्य है।
एलेक्स गुटेनिएव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.