Wie kann man alle Vorkommen eines Zeichens durch ein anderes Zeichen in std::string
?
Antworten
Zu viele Anzeigen?#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;
}
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.
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;
}
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
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.