मुझे यह जाँचने की आवश्यकता है कि क्या एक std: string "xyz" से शुरू होती है। मैं इसे पूरे स्ट्रिंग के माध्यम से खोज या रूट () के साथ अस्थायी तार बनाने के बिना कैसे कर सकता हूं।
जवाबों:
मैं तुलना विधि का उपयोग करेगा:
std::string s("xyzblahblah");
std::string t("xyz")
if (s.compare(0, t.length(), t) == 0)
{
// ok
}
एक दृष्टिकोण जो मानक लाइब्रेरी की भावना को ध्यान में रखते हुए अधिक हो सकता है, वह आपके स्वयं के 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());
}
यह क्लाइंट कोड को एक सरल इंटरफ़ेस प्रदान करता है और अधिकांश मानक लाइब्रेरी कंटेनरों के साथ संगत है।
बूस्ट के स्ट्रिंग अल्गो पुस्तकालय को देखें, जिसमें कई उपयोगी कार्य हैं, जैसे कि start_with, istart_with (केस असंवेदनशील), आदि। यदि आप अपने प्रोजेक्ट में केवल बूस्ट लाइब्रेरी का हिस्सा उपयोग करना चाहते हैं, तो आप कॉपी करने के लिए bcp उपयोगिता का उपयोग कर सकते हैं। केवल आवश्यक फ़ाइलें
ऐसा लगता है कि 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
}
std::string::compare
क्योंकि यह जांचना आसान बनाता है कि क्या स्ट्रिंग अपने आकार को खोजने के लिए शाब्दिक रूप से दोहराए बिना शाब्दिक रूप से शुरू होती है। और सी ++ 20 प्रत्यक्ष समाधान की ओर इशारा करने के लिए धन्यवाद।
मुझे लगता है कि मैं आपके सवाल को पूरी तरह से नहीं समझ रहा हूँ। ऐसा लगता है जैसे यह तुच्छ होना चाहिए:
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;
}
t
।