2017-01-13 1 views
1

Guten Morgen alle, vor ein paar Tagen denke ich, und ich kann die Lösung nicht finden.Ändern Sie mehrere Zeichen in einer Zeichenfolge C++

Ich muss mehrere Zeichen in einer Zeichenfolge ändern, nur die Zeichenfolge-Klasse verwenden.

Ich versuche, die Ersetzungsfunktion zu verwenden, aber ersetzt nur ein Zeichen.

Beispiel:

ORIGINAL-Stichwort: "Hola Pepe, com va la vida"

die caracters Enter aeiou Geben Sie das Zeichen für die ersetzen ersetzen *

H * l * P * p *, c * mv * l * v * d *

Vielen Dank.

+3

Warum durch die ganze Zeichenfolge einfach nicht gezeigt iterieren und den Charakter bei Bedarf ändern? – alexeykuzmin0

+1

Bitte zeigen Sie uns, was Sie bisher versucht haben. SO ist kein Code-Schreibservice, Bitte lesen Sie auch http://StackOverflow.com/Help/How-to-Ark und http://StackOverflow.com/Help/Mcve –

+0

@Kinyu 96 Verwenden Sie die Methode find_first_of –

Antwort

5

Ich würde die meisten lesbare Art und Weise sagen, zu tun, was Sie wollen, ist mit std::transform:

#include <algorithm> 
... 
std::set<char> vowels = {'a', 'o', 'e', 'i', 'u'}; 
char change_to = '*'; 
std::string s = "Hola Pepe, com va la vida"; 
auto transformation_operation = [vowels, change_to](char c) 
{ 
    return vowels.count(c) ? change_to : c; 
}; 
std::transform(s.begin(), s.end(), s.begin(), transformation_operation); 

Hier transformation_operation ist ein Lambda, die ein Zeichen verwandelt tatsächlich in der gewünschten Art und Weise (kann in Form eines implementiert werden Funktion oder Klasse, wenn Sie möchten). Dazu werden die Sätze vowels und change_to verwendet, die erfasst werden. Um weitere Details hinzuzufügen, wird überprüft, ob das Zeichen in der vowels-Gruppe vorhanden ist, und, falls vorhanden, wird change_to zurückgegeben. Ist dies nicht der Fall, wird das ursprüngliche Zeichen zurückgegeben.

std::transform Anrufe dieses lambda für jedes Element von s.begin() zu s.end() das Ergebnis mit s.begin() beginnend zu speichern, das heißt, an seinem Platz.

0

Ich empfehle die std::string Methode find_first_of zu verwenden.

Zum Beispiel

#include <iostream> 
#include <string> 

int main() 
{ 
    std::string s("Hola Pepe, com va la vida"); 
    std::string t("aeiou"); 
    char c = '*'; 

    std::cout << s << std::endl; 

    for (std::string::size_type pos = 0; 
     (pos = s.find_first_of(t, pos)) != std::string::npos; 
     ++pos) 
    { 
     //s.replace(pos, 1, 1, c); 
     s[pos] = c; 
    } 

    std::cout << s << std::endl; 
} 

Die Programmausgabe ist

Hola Pepe, com va la vida 
H*l* P*p*, c*m v* l* v*d* 

Wenn Standard-Algorithmen verwenden, dann denke ich, die am besten geeigneten Algorithmus in diesem Fall std::replace_if ist. Zum Beispiel

#include <iostream> 
#include <string> 
#include <set> 
#include <algorithm> 

int main() 
{ 
    std::string s("Hola Pepe, com va la vida"); 
    std::set<char> t({ 'a', 'e', 'i', 'o', 'u' }); 
    char c = '*'; 

    std::cout << s << std::endl; 

    std::replace_if(s.begin(), s.end(), 
     [&t](char c) { return t.count(c); }, c); 

    std::cout << s << std::endl; 
} 

Das Programm Ausgabe ist das gleiche wie oben

Hola Pepe, com va la vida 
H*l* P*p*, c*m v* l* v*d* 
+1

Lösung mit 'std :: find_first_of' wird schlechte Leistung bei großen Strings haben – alexeykuzmin0

+0

@ alexeykuzmin0 Für große Strings können Sie std :: replace_if benutzen, wie ich in meiner Antwort gezeigt habe. –

Verwandte Themen