Tôi cần kiểm tra xem chuỗi std: có bắt đầu bằng "xyz" hay không. Làm cách nào để làm điều đó mà không cần tìm kiếm toàn bộ chuỗi hoặc tạo chuỗi tạm thời với substr ().
Câu trả lời:
Tôi sẽ sử dụng phương pháp so sánh:
std::string s("xyzblahblah");
std::string t("xyz")
if (s.compare(0, t.length(), t) == 0)
{
// ok
}
Một cách tiếp cận có thể phù hợp hơn với tinh thần của Thư viện Chuẩn là xác định thuật toán begin_with của riêng bạn.
#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());
}
Điều này cung cấp một giao diện đơn giản hơn cho mã máy khách và tương thích với hầu hết các vùng chứa Thư viện Chuẩn.
Hãy xem thư viện String Algo của Boost , có một số chức năng hữu ích, chẳng hạn như start_with, istart_with (phân biệt chữ hoa chữ thường), v.v. Nếu bạn chỉ muốn sử dụng một phần của thư viện boost trong dự án của mình, thì bạn có thể sử dụng tiện ích bcp để sao chép chỉ những tệp cần thiết
Có vẻ như std :: string :: start_with nằm bên trong C ++ 20, trong khi std :: string :: find có thể được sử dụng
std::string s1("xyzblahblah");
std::string s2("xyz")
if (s1.find(s2) == 0)
{
// ok, s1 starts with s2
}
std::string::compare
vì nó giúp dễ dàng kiểm tra xem chuỗi có bắt đầu bằng một ký tự hay không mà không cần lặp lại chính ký tự đó để tìm kích thước của nó. Và cảm ơn bạn đã chỉ đến giải pháp trực tiếp C ++ 20.
Tôi cảm thấy tôi không hoàn toàn hiểu câu hỏi của bạn. Có vẻ như nó phải là tầm thường:
s[0]=='x' && s[1]=='y' && s[2]=='z'
Điều này chỉ xem xét (nhiều nhất) ba ký tự đầu tiên. Tổng quát hóa cho một chuỗi không xác định tại thời điểm biên dịch sẽ yêu cầu bạn thay thế ở trên bằng một vòng lặp:
// look for t at the start of s
for (int i=0; i<s.length(); i++)
{
if (s[i]!=t[i])
return false;
}
t
.