Probleme mit dem Verständnis von Teilen des Codes; die Ausgabe, die ich bekomme, ist auch falsch. Das Problem besteht darin, alle Leerzeichen in einer Zeichenfolge durch '% 20' zu ersetzen. Der vollständige Code ist unten abgebildet. Es kompiliert, läuft aber nicht genau so, wie es sollte.Ersetzen aller Leerzeichen in einer Zeichenfolge durch '% 20' (C++)
#include <iostream>
#include <string>
using namespace std;
void replaceSpaces(string str){
//Getting the length of the string, counting the number of spaces
int strLen = str.length();
int i, count = 0;
for (i = 0; i <= strLen; i++) {
if(str[i]==' ')
count++;
}
//Determining the new length needed to allocate for replacement characters '%20'
int newLength = strLen + count * 2;
str[newLength] = '\0';
for (i = strLen - 1; i >= 0; i--) {
if (str[i] == ' ') {
str[newLength - 1] = '0';
str[newLength - 2] = '2';
str[newLength - 3] = '%';
newLength = newLength - 3;
}
else {
str[newLength - 1] = str[i];
newLength = newLength -1;
}
}
cout << str <<endl;
}
int main() {
string str = "hello jellybean hello";
replaceSpaces(str);
return 0;
}
ich wahrscheinlich ich etwas fehlt offensichtlich, aber wenn für den neuen String-Länge in dieser Zeile Zuweisung:
int newLength = strLen + count * 2;
Hier haben wir die Anzahl der Räume, die durch 2 multipliziert werden, aber Wenn wir versuchen, alle Räume durch '% 20' zu ersetzen, warum nicht mit 3 multiplizieren?
str[newLength] = '\0';
Enthält diese Linie zeigt, dass die Position hinter dem letzten Zeichen in der Zeichenfolge einen Nullraum zugeordnet ist?
Bin auch verwirrt über die else
Aussage.
else {
str[newLength - 1] = str[i];
newLength = newLength -1;
}
Nicht sicher, ob ich den Umstand vollständig verstehe, wenn dies ausgeführt würde.
Wenn die Funktionen kompiliert und ausgeführt werden, wenn
string str = "hello jellybean hello";
die erwartete Ausgabe hallo% 20jellybean% 20hello, außer die Ausgabe erhalte ich sein würde, ist hallo% 20jellybean% 20h.
In Bezug auf Zeit Komplexität, da gibt es zwei unabhängige for
Schleifen, wäre die Zeit Komplexität O (n)?
Ich weiß, ich stelle viele verschiedene Fragen, vielen Dank im Voraus für Antworten!
Wenn Sie eine beliebige Stelle in einer Zeichenfolge indizieren (und festlegen), wird die Zeichenfolge nicht automatisch auf diese Länge vergrößert. Danach habe ich aufgehört zu suchen. Naja, ich habe die Frage über '* 3 'gelesen. Für jede Ersetzung subtrahieren Sie ein Zeichen - den Originalraum - und addieren 3. So ... – davidbak
'str [newLength]' greift auf den Speicherplatz zu, der über den Speicherplatz hinausgeht, der für 'str' reserviert ist. Was Sie tun möchten, ist eine neue Zeichenfolge mit der neuen Größe zu erstellen, kopieren Sie die alte Zeichenfolge über und ersetzen Sie die Leerzeichen mit "% 20" – ShuberFu
Der einfachste Ansatz wäre 'strtok()' zu verwenden, um Ihre Zeichenfolge zu spalten an Leerzeichen und Zeichenketten-Token erstellen). Dann iteriere einfach durch die Token und lege ein% 20 zwischen jedes Token ... 'char * tokens = strtok (mein_string," "); while (Token) {cout << Token << "% 20"; Token = strtok (NULL, ""); } ' – Ingenioushax