স্ট্যান্ড :: স্ট্রিং তুলনা (স্ট্রিং অন্য স্ট্রিং দিয়ে শুরু হয় কিনা তা পরীক্ষা করুন)


90

"Xyz" দিয়ে স্ট্যান্ডিং স্ট্রিং শুরু হচ্ছে কিনা তা আমাকে পরীক্ষা করে দেখতে হবে। পুরো স্ট্রিংটি অনুসন্ধান না করে বা সাবস্ট্রটার () দিয়ে অস্থায়ী স্ট্রিং তৈরি না করে কীভাবে করব।

উত্তর:


164

আমি তুলনা পদ্ধতি ব্যবহার করব:

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

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

4
আপনি কেবল s.compare (টি) ব্যবহার করবেন না কেন?
ফ্রাঙ্ক মেসিরার্ড

4
@ ফ্র্যাঙ্কমিসার্ড: এটি কারণ ডিফল্টরূপে তুলনা সদস্যের ডেটাগুলির সাথে পাসের স্ট্রিংয়ের পুরো দৈর্ঘ্যের তুলনা করার চেষ্টা করবে এবং মিথ্যা প্রত্যাবর্তন করবে, যখন প্যারামিটারের দৈর্ঘ্য হিসাবে দৈর্ঘ্য দিলে এটি সত্য হয়ে যায় (মানে স্ট্যান্ড :: বেসিক_স্ট্রিং :: তুলনা করুন , যখন অফসেট এবং দৈর্ঘ্যের সাথে ব্যবহার করা হয়, অন্য লাইব্রেরিতে স্ট্রিং.বিগিনসুইথ () এর মতো ব্যবহার করা যায়) অফসেট এবং দৈর্ঘ্য ব্যতীত এটি সত্য হবে না।
কিংবদন্তি

4
টি খালি থাকলে এটি সত্য হয়।
গ্লাইডারাইট 16

14
@ gliderkite যেমনটি হওয়া উচিত ... খালি স্ট্রিংটি প্রতিটি স্ট্রিংয়ের একটি প্রাথমিক উপসর্গ।
জিম বাল্টার

4
যেমনটি ঠিক হওয়া উচিত ... আপনি যদি খালি স্ট্রিংগুলি বাতিল করতে চান: যদি (! T.empty () &&! S.compare (0, t.leight (), t))
এরিক্কার্টিন

14

স্ট্যান্ডার্ড লাইব্রেরির স্পিরিটের সাথে মিল রেখে আরও এমন একটি পন্থা হ'ল আপনার নিজস্ব_সংশ্লিষ্ট আলগোরিদিম সংজ্ঞায়িত করা।

#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());
}

এটি ক্লায়েন্ট কোডগুলিতে একটি সহজ ইন্টারফেস সরবরাহ করে এবং বেশিরভাগ স্ট্যান্ডার্ড লাইব্রেরি পাত্রে উপযুক্ত।


কুল! এটি উত্সাহ যুক্ত করা উচিত!
ডেভিড

4
@David: যদি বুস্ট একটি অনুমোদিত নির্ভরতা হয়, দেখতে বুস্ট :: অ্যালগরিদম :: starts_with - 'শুরু হয়েছে' বিধেয়
নেই Gábor

10

বুস্টের স্ট্রিং অ্যালগো লাইব্রেরির দিকে নজর দিন , এতে বেশ কয়েকটি দরকারী ফাংশন রয়েছে যেমন: start_with, istart_with (কেস সংবেদনশীল), ইত্যাদি ইত্যাদি যদি আপনি আপনার প্রকল্পে বুস্ট লাইব্রেরির অংশ ব্যবহার করতে চান তবে অনুলিপি করতে আপনি বিসিপি ইউটিলিটি ব্যবহার করতে পারেন শুধুমাত্র ফাইল দরকার


4

দেখে মনে হচ্ছে যে স্টাড :: স্ট্রিং :: সূচনা_ও সি ++ এর মধ্যে রয়েছে 20 এর মধ্যে, স্টাড :: স্ট্রিং :: সন্ধানটি ব্যবহার করা যেতে পারে

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

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

4
এটি ব্যবহার করে গৃহীত উত্তরের চেয়ে অনেক ভাল std::string::compareকারণ এটির আকারটি খুঁজে না পাওয়ার জন্য আক্ষরিক সাথে পুনরায় না বলে স্ট্রিংটি আক্ষরিক দিয়ে শুরু হয় কিনা তা পরীক্ষা করা সহজ করে তোলে। এবং সি ++ 20 সরাসরি সমাধানের দিকে নির্দেশ করার জন্য ধন্যবাদ।
Ruslan

যদি এস 1 এস 2 দিয়ে শুরু না হয় তবে এটি এর পরে এটি মিলানোর চেষ্টা করবে, যা তুলনা () এর চেয়ে ভাল নয়।
117

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;
}

ভাল, আমি সি ফাংশন ব্যবহার করে স্ট্রিং তুলনা করতে জানি। আমার প্রশ্নটি এটি সি ++ এসটিএল মাধ্যমে অবজেক্ট ভিত্তিক উপায়ে করার বিষয়ে ছিল।
জ্যাকহাব

এখানে কোনও সি ফাংশন ব্যবহৃত হচ্ছে না। এবং স্ট্যান্ডার্ড লাইব্রেরি আপনাকে নিজের নিজস্ব নিষেধাজ্ঞাগুলি লিখতে বাধা দেয় না।

6
আর যদি টি এর চেয়ে কম হয়?
vidtige

@ জ্যাকহাব এসটিএলের লেখক বলেছেন, "এসটিএল উদ্দেশ্য ভিত্তিক নয়। আমি মনে করি যে কৃত্রিম বুদ্ধিমত্তার মতো অবজেক্ট ওরিয়েন্টডনেস প্রায় ততটা প্রতারণা।" - stlport.org/resources/StepanovUSA.html
জিম

4
@vidstige এরপরে লুপটি সমাপ্ত হয় যখন এটি এনআরএলটি সমাপ্তির সাথে মুখোমুখি হয় t
জিম বাল্টার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.