ฉันต้องการตรวจสอบว่า std: string ขึ้นต้นด้วย "xyz" หรือไม่ ฉันจะทำได้อย่างไรโดยไม่ต้องค้นหาสตริงทั้งหมดหรือสร้างสตริงชั่วคราวด้วย substr ()
ฉันต้องการตรวจสอบว่า std: string ขึ้นต้นด้วย "xyz" หรือไม่ ฉันจะทำได้อย่างไรโดยไม่ต้องค้นหาสตริงทั้งหมดหรือสร้างสตริงชั่วคราวด้วย substr ()
คำตอบ:
ฉันจะใช้วิธีการเปรียบเทียบ:
std::string s("xyzblahblah");
std::string t("xyz")
if (s.compare(0, t.length(), t) == 0)
{
// ok
}
แนวทางที่อาจสอดคล้องกับเจตนารมณ์ของไลบรารีมาตรฐานคือการกำหนดอัลกอริทึม begin_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());
}
สิ่งนี้ให้อินเทอร์เฟซที่ง่ายกว่าสำหรับโค้ดไคลเอ็นต์และเข้ากันได้กับคอนเทนเนอร์ไลบรารีมาตรฐานส่วนใหญ่
มองไปที่ไลบรารีString Algoของ Boost ซึ่งมีฟังก์ชันที่มีประโยชน์มากมายเช่น start_with, istart_with (case insensitive) เป็นต้นหากคุณต้องการใช้เฉพาะบางส่วนของ boost libraries ในโปรเจ็กต์ของคุณคุณสามารถใช้ยูทิลิตี้ 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
เนื่องจากทำให้ง่ายต่อการตรวจสอบว่าสตริงขึ้นต้นด้วยตัวอักษรหรือไม่โดยไม่ต้องใช้ตัวอักษรซ้ำเพื่อค้นหาขนาด และขอขอบคุณที่ชี้ไปที่โซลูชันโดยตรง C ++ 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
.