Bagaimana saya bisa mengetahui jika sebuah string diakhiri dengan string lain di C ++?
270
Cukup bandingkan n karakter terakhir menggunakan std::string::compare
:
#include <iostream>
bool hasEnding (std::string const &fullString, std::string const &ending) {
if (fullString.length() >= ending.length()) {
return (0 == fullString.compare (fullString.length() - ending.length(), ending.length(), ending));
} else {
return false;
}
}
int main () {
std::string test1 = "binary";
std::string test2 = "unary";
std::string test3 = "tertiary";
std::string test4 = "ry";
std::string ending = "nary";
std::cout << hasEnding (test1, ending) << std::endl;
std::cout << hasEnding (test2, ending) << std::endl;
std::cout << hasEnding (test3, ending) << std::endl;
std::cout << hasEnding (test4, ending) << std::endl;
return 0;
}
Gunakan fungsi ini:
sumber
std::equal(suffix.rbegin(), suffix.rend(), str.rbegin()
Dalam mode debug, ia melempar:_DEBUG_ERROR("string iterator not decrementable");
Gunakan
boost::algorithm::ends_with
(lihat misalnya http://www.boost.org/doc/libs/1_34_0/doc/html/boost/algorithm/ends_with.html ):sumber
Catatan, bahwa mulai dari c ++ 20 std :: string akhirnya akan menyediakan begin_with dan ends_with . Sepertinya ada kemungkinan bahwa dengan c ++ 30 string dalam c ++ akhirnya bisa digunakan, jika Anda tidak membaca ini dari masa depan yang jauh, Anda dapat menggunakan ini dimulai Dengan / berakhir Dengan:
dan beberapa kelebihan pembantu ekstra:
IMO, c ++ string jelas tidak berfungsi, dan tidak dibuat untuk digunakan dalam kode dunia nyata. Tetapi ada harapan bahwa ini akan menjadi lebih baik setidaknya.
sumber
Saya tahu pertanyaannya untuk C ++, tetapi jika ada yang membutuhkan fungsi C yang bagus untuk melakukan ini:
sumber
The
std::mismatch
Metode dapat melayani tujuan ini bila digunakan untuk mundur iterate dari akhir kedua string:sumber
std::equal
: Anda harus memeriksa terlebih dahulu bahwa sufiks yang seharusnya tidak lebih panjang dari string yang Anda cari. Tidak mengikutinya yang mengarah ke perilaku yang tidak terdefinisi.Menurut pendapat saya paling sederhana, solusi C ++ adalah:
sumber
s
alih-alih hanya menguji ujungnya!std::string::size()
adalah operasi waktu-konstan; tidak perlustrlen
.Biarkan
a
menjadi string danb
string yang Anda cari. Gunakana.substr
untuk mendapatkan n karakter terakhira
dan bandingkan dengan b (di mana n adalah panjangb
)Atau gunakan
std::equal
(termasuk<algorithm>
)Ex:
sumber
Biarkan saya memperluas solusi Joseph dengan versi case case ( demo online )
sumber
sama seperti di atas, di sini adalah solusi saya
sumber
starts_with
menggunakan 'string :: compare'? Mengapa tidakstd::equal(start.begin(), start.end(), str.begin())
?Pilihan lain adalah menggunakan regex. Kode berikut membuat pencarian tidak sensitif terhadap huruf besar / kecil:
mungkin tidak begitu efisien, tetapi mudah diimplementasikan.
sumber
Anda dapat menggunakan string :: rfind
Contoh lengkap berdasarkan komentar:
sumber
Periksa apakah str memiliki akhiran , menggunakan di bawah ini:
sumber
Gunakan std :: equal algoritma from
<algorithms>
dengan iterasi terbalik:sumber
Mengenai tanggapan Grzegorz Bazior. Saya menggunakan implementasi ini, tetapi yang asli memiliki bug (mengembalikan true jika saya membandingkan ".." dengan ".so"). Saya mengusulkan fungsi yang dimodifikasi:
sumber
Saya pikir masuk akal untuk mengirim solusi mentah yang tidak menggunakan fungsi pustaka ...
Menambahkan sederhana,
std::tolower
kita bisa membuat case ini tidak sensitifsumber
Menemukan jawaban yang bagus untuk masalah "startWith" yang serupa:
Bagaimana cara memeriksa apakah string C ++ std :: dimulai dengan string tertentu, dan mengonversi substring ke int?
Anda dapat mengadopsi solusi hanya mencari di tempat terakhir di string:
Dengan cara ini Anda dapat membuatnya pendek, cepat, menggunakan standar c ++ dan membuatnya mudah dibaca.
sumber
Jika Anda seperti saya dan tidak begitu menyukai C ++ purism, inilah skool hybrid lama. Ada beberapa keuntungan ketika string lebih dari beberapa karakter, karena sebagian besar
memcmp
implementasi membandingkan kata-kata mesin bila memungkinkan.Anda harus mengendalikan set karakter. Misalnya, jika pendekatan ini digunakan dengan utf-8 atau tipe wchar, ada beberapa kelemahan karena tidak akan mendukung pemetaan karakter - misalnya, ketika dua atau lebih karakter identik secara logis .
sumber
Dua sen saya:
sumber