Saya perlu memeriksa apakah std: string dimulai dengan "xyz". Bagaimana cara melakukannya tanpa mencari seluruh string atau membuat string sementara dengan substr ().
Jawaban:
Saya akan menggunakan metode perbandingan:
std::string s("xyzblahblah");
std::string t("xyz")
if (s.compare(0, t.length(), t) == 0)
{
// ok
}
Pendekatan yang mungkin lebih sesuai dengan semangat Perpustakaan Standar adalah dengan menentukan algoritme begin_with Anda sendiri.
#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());
}
Ini menyediakan antarmuka yang lebih sederhana ke kode klien dan kompatibel dengan sebagian besar wadah Perpustakaan Standar.
Lihat pustaka String Algo Boost , yang memiliki sejumlah fungsi yang berguna, seperti begin_with, istart_with (case insensitive), dll. Jika Anda hanya ingin menggunakan sebagian pustaka boost dalam proyek Anda, Anda dapat menggunakan utilitas bcp untuk menyalin hanya file yang dibutuhkan
Tampaknya std :: string :: begin_with ada di dalam C ++ 20, sedangkan std :: string :: find dapat digunakan
std::string s1("xyzblahblah");
std::string s2("xyz")
if (s1.find(s2) == 0)
{
// ok, s1 starts with s2
}
std::string::compare
karena memudahkan untuk memeriksa apakah string diawali dengan literal tanpa mengulang literal itu sendiri untuk menemukan ukurannya. Dan terima kasih telah menunjuk ke solusi langsung C ++ 20.
Saya merasa saya tidak sepenuhnya memahami pertanyaan Anda. Sepertinya itu sepele:
s[0]=='x' && s[1]=='y' && s[2]=='z'
Ini hanya melihat (paling banyak) tiga karakter pertama. Generalisasi untuk string yang tidak diketahui pada waktu kompilasi akan mengharuskan Anda mengganti yang di atas dengan loop:
// look for t at the start of s
for (int i=0; i<s.length(); i++)
{
if (s[i]!=t[i])
return false;
}
t
.