Zum Beispiel muss ein Benutzer eine Telefonnummer eingeben.
cout << "Enter phone number: ";
INPUT: (555) 555-5555
cin >> phone;
Ich möchte die Zeichen "(", ")" und "-" aus der Zeichenfolge entfernen. Ich habe mir die Funktionen zum Entfernen, Suchen und Ersetzen von Zeichenfolgen angesehen, sehe jedoch nur, dass sie basierend auf der Position funktionieren.
Gibt es eine Zeichenfolgenfunktion, mit der ich ein Zeichen "(") übergeben und alle Instanzen innerhalb einer Zeichenfolge entfernen lassen kann?
std::remove
die nicht entfernten Elemente kurz an die Vorderseite des Vektors und gibt einen Iterator zurück, der direkt hinter das letzte nicht entfernte Element zeigt. Dannstd::erase
schneidet der Vektor von diesem Iterator bis zum Ende.string chars("()-");
und dann.length()
Methode verwenden, um die Länge und.at(i)
Methode zu erhalten, um auf die Zeichen zuzugreifen :) Funktionierte Geige - ideone.com/tAZt5I<iostream>
<algorithm>
<cstring>
Mit dem
std::remove_if()
Algorithmus können Sie nur die von Ihnen angegebenen Zeichen entfernen:Der
std::remove_if()
Algorithmus erfordert ein sogenanntes Prädikat, das ein Funktionszeiger wie das obige Snippet sein kann.Sie können auch ein Funktionsobjekt übergeben (ein Objekt, das den Funktionsaufrufoperator überlastet
()
). Dies ermöglicht es uns, eine noch allgemeinere Lösung zu erstellen:Sie können angeben, welche Zeichen mit der
"()- "
Zeichenfolge entfernt werden sollen. Im obigen Beispiel habe ich ein Leerzeichen hinzugefügt, damit Leerzeichen sowie Klammern und Bindestriche entfernt werden.quelle
ispunct(int c)
remove_if () wurde bereits erwähnt. Mit C ++ 0x können Sie das Prädikat dafür jedoch stattdessen mit einem Lambda angeben.
Unten finden Sie ein Beispiel dafür mit drei verschiedenen Arten der Filterung. "Kopier" -Versionen der Funktionen sind auch für Fälle enthalten, in denen Sie mit einer Konstante arbeiten oder das Original nicht ändern möchten.
quelle
Hier ist eine andere Lösung für alle Interessierten. Es verwendet den neuen For-Bereich in c ++ 11
quelle
str2
Initialisierung ist nicht erforderlich. (2)str = std::move(str2)
wäre effizienter.Ich fürchte, es gibt kein solches Mitglied für std :: string, aber Sie können diese Art von Funktionen einfach programmieren. Es ist vielleicht nicht die schnellste Lösung, aber dies würde ausreichen:
EDIT: Als ich die Antwort unten las, verstand ich, dass sie allgemeiner ist und nicht nur Ziffern erkennt. Bei der obigen Lösung wird jedes in der zweiten Argumentzeichenfolge übergebene Zeichen weggelassen. Beispielsweise:
Wird darin enden, dass
quelle
Hinweis: Möglicherweise müssen Sie
ptr_fun<int, int>
eher schreiben als einfachptr_fun
quelle
std::cref
oderstd::function
(oder Lambdas) verwenden.Ja, Sie können die Funktion isdigit () verwenden, um nach Ziffern zu suchen :)
Bitte schön:
Ich hoffe es hilft :)
quelle
boost::is_any_of
Streifen für alle Zeichen aus einer Zeichenfolge, die in einer anderen angegebenen Zeichenfolge erscheinen:
Getestet in Ubuntu 16.04, Boost 1.58.
quelle
Wenn Sie Zugriff auf einen Compiler haben, der verschiedene Vorlagen unterstützt, können Sie Folgendes verwenden:
quelle
Hier ist noch eine andere Alternative:
Funktioniert mit std :: string und std :: wstring
quelle
Ich bin neu, aber einige der obigen Antworten sind wahnsinnig kompliziert. Hier ist eine Alternative.
HINWEIS: Solange 0-9 zusammenhängend sind (was dem Standard entsprechen sollte), sollten alle anderen Zeichen außer Zahlen und '' herausgefiltert werden. Zu wissen, dass 0-9 zusammenhängend sein sollte und ein Zeichen wirklich ein Int ist, können wir wie folgt tun.
EDIT: Ich habe nicht bemerkt, dass das Poster auch Leerzeichen wollte, also habe ich es geändert ...
Im Folgenden werden die angegebenen Zeichen gefiltert.
quelle
Verwenden von std :: wstring und wchar_t (erfordert den Unicode- Header):
... Lust auf einen statischen Bereichsinitialisierer als nächstes; Es ist nicht notwendig, badChars2 genau so einzurichten. Es ist übertrieben; akademischer als alles andere:
Einfaches, prägnantes Lambda:
Entfernt alle schlechten Zeichen vom Telefon
Ausgabe: "555 5555555"
quelle
Für diejenigen unter Ihnen, die einen prägnanteren, leichter zu lesenden Lambda-Codierungsstil bevorzugen ...
In diesem Beispiel werden alle nicht alphanumerischen Zeichen und Leerzeichen aus einer breiten Zeichenfolge entfernt. Sie können es mit jedem anderen ctype.h verwechseln , um komplex aussehende Tests zu entfernen.
(Ich bin mir nicht sicher, wie diese Funktionen mit CJK-Sprachen umgehen würden. Gehen Sie also leise dorthin.)
Sehen Sie, ob Sie dies nicht einfacher zu verstehen finden als verrauschte C / C ++ for / iterator-Schleifen:
newLabel ergibt sich nach Ausführung dieses Codes: " 1ReplenMoveRPMV "
Dies ist nur akademisch, da es eindeutig präziser, prägnanter und effizienter wäre, die 'if'-Logik von lambda0 (first for_each ) in das einzelne lambda1 (second for_each ) zu kombinieren , wenn Sie bereits festgestellt haben, welche Zeichen die "badChars" sind. .
quelle
Viele gute Antworten, hier ist eine andere Möglichkeit, eine Reihe von Zahlen zu bereinigen, besteht nicht darin, Zeichen zu löschen, sondern die Zahlen zu verschieben.
quelle