Jak mogę się dowiedzieć, czy ciąg znaków kończy się na innym ciągu w C ++?
270
Po prostu porównaj ostatnie n znaków, używając 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;
}
Użyj tej funkcji:
źródło
std::equal(suffix.rbegin(), suffix.rend(), str.rbegin()
W trybie debugowania wyświetla:_DEBUG_ERROR("string iterator not decrementable");
Użyj
boost::algorithm::ends_with
(patrz np. Http://www.boost.org/doc/libs/1_34_0/doc/html/boost/algorithm/ends_with.html ):źródło
Zauważ, że począwszy od c ++ 20 std :: string w końcu zapewni początek_with i koniec_with . Wygląda na to, że istnieje szansa, że c ++ 30 łańcuchów w c ++ może w końcu stać się użytecznymi, jeśli nie czytasz tego z odległej przyszłości, możesz użyć tych początków Z / Końców Z:
i dodatkowe przeciążenia pomocnika:
Ciągi IMO, c ++ są wyraźnie dysfunkcyjne i nie zostały stworzone do użycia w kodzie świata rzeczywistego. Ale jest nadzieja, że przynajmniej będzie lepiej.
źródło
Wiem, że pytanie dotyczy C ++, ale jeśli ktoś potrzebuje dobrze zaprojektowanej funkcji C, aby to zrobić:
źródło
std::mismatch
Metoda może służyć temu celowi, gdy używany do iteracji wstecznej od końca obu ciągów:źródło
std::equal
: musisz wcześniej sprawdzić, czy rzekomy przyrostek nie jest dłuższy niż szukany ciąg. Zaniedbanie sprawdzenia, które prowadzi do nieokreślonego zachowania.Moim zdaniem najprostszym rozwiązaniem C ++ jest:
źródło
s
zamiast testować tylko jego koniec!std::string::size()
jest operacją o stałym czasie; nie potrzebujestrlen
.Niech
a
będzie ciągiem ib
ciągiem, którego szukasz. Posługiwać sięa.substr
aby uzyskać ostatnie n znakówa
i porównać je do b (gdzie n jest długościąb
)Albo użyj
std::equal
(dołącz<algorithm>
)Dawny:
źródło
Pozwól mi rozszerzyć rozwiązanie Josepha o wersję bez rozróżniania wielkości liter ( demo online )
źródło
tak samo jak powyżej, oto moje rozwiązanie
źródło
starts_with
używa „ciąg :: porównaj”? Dlaczego niestd::equal(start.begin(), start.end(), str.begin())
?inną opcją jest użycie wyrażenia regularnego. Poniższy kod powoduje, że wyszukiwanie jest niewrażliwe na wielkie / małe litery:
prawdopodobnie nie tak wydajny, ale łatwy do wdrożenia.
źródło
możesz użyć string :: rfind
Pełny przykład oparty na komentarzach:
źródło
Sprawdź, czy str ma przyrostek , używając poniżej:
źródło
Użyj algorytmu std :: równo
<algorithms>
z odwrotną iteracją:źródło
Odnośnie odpowiedzi Grzegorza Baziora. Użyłem tej implementacji, ale oryginalna ma błąd (zwraca true, jeśli porównam „..” z „.so”). Proponuję zmodyfikowaną funkcję:
źródło
Pomyślałem, że sensowne jest opublikowanie surowego rozwiązania, które nie korzysta z żadnych funkcji bibliotecznych ...
Dodając prosty
std::tolower
możemy sprawić, że wielkość liter nie będzie uwzględnianaźródło
Znalazłem tę przyjemną odpowiedź na podobny problem „startWith”:
Jak sprawdzić, czy C ++ std :: string zaczyna się od określonego ciągu i przekonwertować podłańcuch na int?
Możesz zastosować rozwiązanie wyszukiwania tylko w ostatnim miejscu ciągu:
W ten sposób możesz zrobić to krótko, szybko, użyć standardowego c ++ i uczynić go czytelnym.
źródło
Jeśli jesteś podobny do mnie i nie przepadasz za purytem w C ++, oto stara hybryda skool. Zaletą jest to, że ciągi znaków to więcej niż garść znaków, jak większość
memcmp
implementacji porównuje słowa maszynowe, gdy jest to możliwe.Musisz kontrolować zestaw znaków. Na przykład, jeśli takie podejście jest używane z typem utf-8 lub wchar, istnieje pewna wada, ponieważ nie obsługuje mapowania znaków - np. Gdy dwa lub więcej znaków jest logicznie identycznych .
źródło
Moje dwa centy:
źródło