std :: स्ट्रिंग तुलना (जांचें कि क्या स्ट्रिंग दूसरे स्ट्रिंग से शुरू होती है)


90

मुझे यह जाँचने की आवश्यकता है कि क्या एक std: string "xyz" से शुरू होती है। मैं इसे पूरे स्ट्रिंग के माध्यम से खोज या रूट () के साथ अस्थायी तार बनाने के बिना कैसे कर सकता हूं।

जवाबों:


164

मैं तुलना विधि का उपयोग करेगा:

std::string s("xyzblahblah");
std::string t("xyz")

if (s.compare(0, t.length(), t) == 0)
{
// ok
}

3
आप केवल s.compare (t) का उपयोग क्यों नहीं करते?
फ्रेंक मेसिरार्ड

5
@FranckMesirard: ऐसा इसलिए है क्योंकि डिफ़ॉल्ट तुलना में सदस्य डेटा के खिलाफ पारित स्ट्रिंग की पूरी लंबाई की तुलना करने की कोशिश करेंगे और झूठी वापसी करेंगे, जबकि लंबाई को पारित पैरामीटर्स की लंबाई के रूप में यह सच लौटा देगा (जिसका अर्थ है std :: basic_rring :: तुलना , जब ऑफसेट और लंबाई के साथ प्रयोग किया जाता है, तो स्ट्रिंग का उपयोग किया जा सकता है। अन्य पुस्तकालयों में String.BeginsWith () के बिना। ऑफसेट और लंबाई के बिना, यह सच नहीं होगा।
किंवदंतियों 2k

1
यह सच है अगर टी खाली है।
ग्लाइडराइट

14
@gliderkite जैसा कि यह होना चाहिए ... खाली स्ट्रिंग प्रत्येक स्ट्रिंग का एक प्रारंभिक उपसर्ग है।
जिम बाल्टर

1
जैसा कि यह सही होना चाहिए ... यदि आप खाली तारों पर शासन करना चाहते हैं: अगर (! T.empty () & s! Spare) (0, t.length (), t)
ericcurtin

14

एक दृष्टिकोण जो मानक लाइब्रेरी की भावना को ध्यान में रखते हुए अधिक हो सकता है, वह आपके स्वयं के start_with एल्गोरिथ्म को परिभाषित करने के लिए होगा।

#include <algorithm>
using namespace std;


template<class TContainer>
bool begins_with(const TContainer& input, const TContainer& match)
{
    return input.size() >= match.size()
        && equal(match.begin(), match.end(), input.begin());
}

यह क्लाइंट कोड को एक सरल इंटरफ़ेस प्रदान करता है और अधिकांश मानक लाइब्रेरी कंटेनरों के साथ संगत है।


ठंडा! इसे बढ़ावा देने के लिए जोड़ा जाना चाहिए!
डेविड

2
@ दाऊद: अगर बढ़ावा एक की अनुमति दी निर्भरता है, देखना बढ़ावा :: एल्गोरिथ्म :: starts_with - 'शुरू होता है के साथ' विधेय
गेबर

10

बूस्ट के स्ट्रिंग अल्गो पुस्तकालय को देखें, जिसमें कई उपयोगी कार्य हैं, जैसे कि start_with, istart_with (केस असंवेदनशील), आदि। यदि आप अपने प्रोजेक्ट में केवल बूस्ट लाइब्रेरी का हिस्सा उपयोग करना चाहते हैं, तो आप कॉपी करने के लिए bcp उपयोगिता का उपयोग कर सकते हैं। केवल आवश्यक फ़ाइलें


4

ऐसा लगता है कि std :: string :: start_with C ++ 20 के अंदर है, इस बीच std :: string :: find का उपयोग किया जा सकता है

std::string s1("xyzblahblah");
std::string s2("xyz")

if (s1.find(s2) == 0)
{
   // ok, s1 starts with s2
}

1
यह उपयोग किए गए स्वीकृत उत्तर की तुलना में बहुत बेहतर है std::string::compareक्योंकि यह जांचना आसान बनाता है कि क्या स्ट्रिंग अपने आकार को खोजने के लिए शाब्दिक रूप से दोहराए बिना शाब्दिक रूप से शुरू होती है। और सी ++ 20 प्रत्यक्ष समाधान की ओर इशारा करने के लिए धन्यवाद।
रुस्लान

यदि s1 s2 के साथ शुरू नहीं होता है, तो यह बाद में भी इसे मेल खाने की कोशिश करेगा, जो तुलना () के रूप में अच्छा नहीं है।
a117

0

मुझे लगता है कि मैं आपके सवाल को पूरी तरह से नहीं समझ रहा हूँ। ऐसा लगता है जैसे यह तुच्छ होना चाहिए:

s[0]=='x' && s[1]=='y' && s[2]=='z'

यह केवल (सबसे अधिक) पहले तीन वर्णों को देखता है। एक स्ट्रिंग के लिए सामान्यीकरण जो संकलन के समय अज्ञात है, आपको उपरोक्त को लूप से बदलने की आवश्यकता होगी:

// look for t at the start of s
for (int i=0; i<s.length(); i++)
{
  if (s[i]!=t[i])
    return false;
}

खैर, मुझे पता है कि सी फ़ंक्शन का उपयोग करने में तार की तुलना कैसे करें। मेरा प्रश्न C ++ STL के माध्यम से इसे ऑब्जेक्ट-ओरिएंटेड तरीके से करने के बारे में था।
जैकब

यहाँ कोई C फ़ंक्शन का उपयोग नहीं किया जा रहा है। और मानक लाइब्रेरी आपको अपने स्वयं के प्रतिबंधों को लिखने से रोकता नहीं है।

6
और क्या होगा यदि t s से छोटा है?
vidstige

@jackhab एसटीएल के लेखक का कहना है "एसटीएल ऑब्जेक्ट ओरिएंटेड नहीं है। मुझे लगता है कि ऑब्जेक्ट ओरिएंटेशन आर्टिफिशियल इंटेलिजेंस के रूप में लगभग एक धोखा है।" - stlport.org/resource/StepanovUSA.html
जिम

1
@vidstige तब लूप समाप्त हो जाता है जब यह एनयूएल को समाप्त करने का सामना करता है t
जिम बाल्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.