STD :: مقارنة سلسلة (تحقق مما إذا كانت السلسلة تبدأ بسلسلة أخرى)

StackOverflow https://stackoverflow.com/questions/931827

  •  06-09-2019
  •  | 
  •  

سؤال

أحتاج إلى التحقق مما إذا كانت STD: تبدأ السلسلة ب "XYZ". كيف يمكنني القيام بذلك دون البحث من خلال السلسلة بأكملها أو إنشاء سلاسل مؤقتة مع Serchtr ().

هل كانت مفيدة؟

المحلول

أود استخدام طريقة مقارنة:

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

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

نصائح أخرى

سيكون نهج قد يكون أكثر تمشيا مع روح المكتبة القياسية هو تحديد خوارزمية البداية الخاصة بك.

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

يوفر هذا واجهة أبسط لرمز العميل ومتوافق مع معظم حاويات المكتبة القياسية.

انظر إلى دفعة سلسلة algo. المكتبة، التي لها عدد من الوظائف المفيدة، مثل Starts_With، ISTART_WITH (غير حساس للحالة)، وما إلى ذلك. إذا كنت ترغب في استخدام جزء فقط من مكتبات Boost في مشروعك، يمكنك استخدام الأداة المساعدة BCP لنسخ الملفات المطلوبة فقط

يبدو أن STD :: سلسلة :: Starts_With داخل C ++ 20، وفي الوقت نفسه STD :: سلسلة :: العثور يمكن استخدامها

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

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

أشعر أنني لا أفهم سؤالك تماما. يبدو كما لو أنه ينبغي أن يكون تافهة:

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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top