641 Stimmen

Wie kann man alle Vorkommen eines Zeichens in einer Zeichenfolge ersetzen?

Wie kann man alle Vorkommen eines Zeichens durch ein anderes Zeichen in std::string ?

3voto

Lloydie Punkte 31
#include <iostream>
#include <string>
using namespace std;
// Replace function..
string replace(string word, string target, string replacement){
    int len, loop=0;
    string nword="", let;
    len=word.length();
    len--;
    while(loop<=len){
        let=word.substr(loop, 1);
        if(let==target){
            nword=nword+replacement;
        }else{
            nword=nword+let;
        }
        loop++;
    }
    return nword;

}
//Main..
int main() {
  string word;
  cout<<"Enter Word: ";
  cin>>word;
  cout<<replace(word, "x", "y")<<endl;
  return 0;
}

1voto

chara Punkte 53

Wie wäre es, eine beliebige Zeichenkette durch eine beliebige Zeichenkette zu ersetzen, indem man nur die guten alten C-String-Funktionen verwendet?

char original[256]="First Line\nNext Line\n", dest[256]="";
char* replace_this = "\n"; // this is now a single character but could be any string
char* with_this = "\r\n"; // this is 2 characters but could be of any length

/* get the first token */
char* token = strtok(original, replace_this);

/* walk through other tokens */
while (token != NULL) {
    strcat(dest, token);
    strcat(dest, with_this);
    token = strtok(NULL, replace_this);
}

dest sollten jetzt das haben, wonach wir suchen.

1voto

alex Punkte 399

Hier ist eine Lösung, die ich im Geiste der maximalen DRI entwickelt habe. es sucht sNeedle in sHaystack und ersetzt es durch sReplace, nTimes wenn nicht 0, sonst alle sNeedle Vorkommen. es wird nicht noch einmal in dem ersetzten Text suchen.

std::string str_replace(
    std::string sHaystack, std::string sNeedle, std::string sReplace, 
    size_t nTimes=0)
{
    size_t found = 0, pos = 0, c = 0;
    size_t len = sNeedle.size();
    size_t replen = sReplace.size();
    std::string input(sHaystack);

    do {
        found = input.find(sNeedle, pos);
        if (found == std::string::npos) {
            break;
        }
        input.replace(found, len, sReplace);
        pos = found + replen;
        ++c;
    } while(!nTimes || c < nTimes);

    return input;
}

1voto

Guney Ozsan Punkte 254

Für einfache Situationen funktioniert dies ziemlich gut, ohne dass eine andere Bibliothek als std::string (die bereits in Gebrauch ist) verwendet wird.

Ersetzen Sie alle Vorkommen des Zeichens a mit Charakter b in irgendein_string :

for (size_t i = 0; i < some_string.size(); ++i) {
    if (some_string[i] == 'a') {
        some_string.replace(i, 1, "b");
    }
}

Wenn die Zeichenfolge groß ist oder mehrere Aufrufe zum Ersetzen ein Problem darstellen, können Sie die in dieser Antwort erwähnte Technik anwenden: https://stackoverflow.com/a/29752943/3622300

0voto

Kiruahxh Punkte 775

Dies ist nicht die einzige Methode, die in der Standardbibliothek fehlt, sie war als Low-Level-Methode gedacht. Dieser Anwendungsfall und viele andere werden von allgemeinen Bibliotheken abgedeckt, wie z.B.:

QtCore & QString wird von mir bevorzugt: es unterstützt UTF8 und verwendet weniger Templates, was verständliche Fehler und schnellere Kompilierung bedeutet. Es verwendet das Präfix "q", das Namespaces überflüssig macht und die Header vereinfacht.
Boost erzeugt oft hässliche Fehlermeldungen und verlangsamt die Kompilierzeit.
POCO scheint ein vernünftiger Kompromiss zu sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X