Na przykład mam użytkownika, który wprowadza numer telefonu.
cout << "Enter phone number: ";
INPUT: (555) 555-5555
cin >> phone;
Chcę usunąć znaki „(”, „)” i „-” z ciągu. Przyjrzałem się ciągowi funkcji usuń, znajdź i zamień, ale widzę tylko, że działają one w oparciu o pozycję.
Czy istnieje funkcja ciągu znaków, której mogę użyć do przekazania znaku, na przykład „(”) i czy ma ona usunąć wszystkie wystąpienia w ciągu?
std::remove
przenosi nieusunięte elementy na przód wektora i zwraca iterator wskazujący tuż poza ostatnim nieusuniętym elementem. Następniestd::erase
przycina wektor od tego iteratora do końca.string chars("()-");
a następnie użyć.length()
metody, aby uzyskać długość i.at(i)
metodę dostępu do znaków :) Funkcjonalne skrzypce - ideone.com/tAZt5I<iostream>
<algorithm>
<cstring>
Możesz użyć
std::remove_if()
algorytmu, aby usunąć tylko określone znaki:std::remove_if()
Algorytm wymaga czegoś nazywanego orzeczenie, które może być wskaźnikiem funkcji jak fragmencie powyżej.Możesz również przekazać obiekt funkcji (obiekt, który przeciąża
()
operator wywołania funkcji ). To pozwala nam stworzyć jeszcze bardziej ogólne rozwiązanie:Możesz określić, które znaki mają zostać usunięte za pomocą
"()- "
ciągu. W powyższym przykładzie dodałem spację, aby usunąć spacje, a także nawiasy i myślniki.źródło
ispunct(int c)
remove_if () została już wspomniana. Ale w C ++ 0x możesz zamiast tego określić predykat za pomocą lambdy.
Poniżej znajduje się przykład tego z 3 różnymi sposobami filtrowania. „Kopiuj” wersje funkcji są również dołączone w przypadkach, gdy pracujesz ze stałą lub nie chcesz modyfikować oryginału.
źródło
Oto inne rozwiązanie dla wszystkich zainteresowanych. Używa nowego zakresu For w języku c ++ 11
źródło
str2
inicjalizacja nie jest wymagana. (2)str = std::move(str2)
byłoby bardziej wydajne.Obawiam się, że nie ma takiego członka dla std :: string, ale można łatwo zaprogramować tego rodzaju funkcje. Może nie jest to najszybsze rozwiązanie, ale wystarczyłoby:
EDYCJA: Czytając odpowiedź poniżej, zrozumiałem, że jest bardziej ogólna, nie tylko w celu wykrycia cyfry. Powyższe rozwiązanie pominie każdy znak przekazany w ciągu drugiego argumentu. Na przykład:
Spowoduje
źródło
Uwaga: możliwe, że będziesz musiał pisać,
ptr_fun<int, int>
a nie prosteptr_fun
źródło
std::cref
lubstd::function
(lub lambd).Tak, możesz użyć funkcji isdigit (), aby sprawdzić cyfry :)
Proszę bardzo:
Mam nadzieję, że to pomoże :)
źródło
boost::is_any_of
Usuń wszystkie znaki z jednego ciągu, które pojawiają się w innym podanym ciągu:
Testowane w Ubuntu 16.04, Boost 1.58.
źródło
Jeśli masz dostęp do kompilatora obsługującego szablony wariadyczne, możesz użyć tego:
źródło
Oto kolejna alternatywa:
Działa z std :: string i std :: wstring
źródło
Jestem nowy, ale niektóre z powyższych odpowiedzi są niesamowicie skomplikowane, więc oto alternatywa.
UWAGA: Dopóki 0-9 są ciągłe (co powinno być zgodne ze standardem), powinno to odfiltrować wszystkie inne znaki oprócz liczb i ''. Wiedząc, że cyfry 0-9 powinny być ciągłe, a znak jest w rzeczywistości liczbą int, możemy wykonać poniższe czynności.
EDYCJA: Nie zauważyłem, że plakat też chciał spacje, więc zmieniłem to ...
Poniżej znajduje się filtrowanie dostarczonych znaków.
źródło
Przy użyciu std :: wstring i wchar_t (wymaga nagłówka Unicode ):
... dalej fantazyjny inicjator zakresu statycznego; nie trzeba konfigurować badChars2 dokładnie w ten sam sposób. To przesada; bardziej akademicki niż cokolwiek innego:
Prosta, zwięzła lambda:
Usuwa wszystkie złe postacie z telefonu
Dane wyjściowe: „555 5555555”
źródło
Dla tych z Was, którzy wolą bardziej zwięzły, łatwiejszy do odczytania styl kodowania lambda ...
Ten przykład usuwa wszystkie znaki inne niż alfanumeryczne i białe znaki z szerokiego ciągu. Możesz go zmieszać z innymi funkcjami pomocniczymi ctype.h, aby usunąć złożone testy znakowe.
(Nie jestem pewien, jak te funkcje poradziłyby sobie z językami CJK, więc idź tam cicho).
Sprawdź, czy nie jest to łatwiejsze do zrozumienia niż hałaśliwe pętle C / C ++ for / iterator:
newLabel wyniki po uruchomieniu tego kodu: „ 1ReplenMoveRPMV ”
To jest tylko akademickie, ponieważ byłoby wyraźnie bardziej precyzyjne, zwięzłe i wydajniejsze połączenie logiki „if” z lambda0 (pierwsza for_each ) w pojedynczą lambda1 (druga for_each ), jeśli już ustaliłeś, które znaki są „badChars” .
źródło
Wiele dobrych odpowiedzi, oto inny sposób na uporządkowanie ciągu liczb, nie polega na usuwaniu znaków, ale na usunięciu liczb.
źródło