1. Die einfachste Lösung mit string
Methoden:
string str = " many spaces ";
while(true)
{
// find the starting position of two consecutive space characters
unsigned int pos = str.find(" ");
// if str.find does not find two consecutive spaces, it will return string::npos
if(pos == string::npos) // no more consecutive spaces
{
break;
}
else // found two consecutive spaces
{
// erase one space
str.erase(pos, 1);
}
}
2. Die Lösung ohne string
Methoden (Fortgeschrittene):
char charArray[] = " many spaces ";
int write_index = 1;
if(sizeof(charArray) > 1) // the check starts at position 1 because we need to check if the previous character too (if it is a space)
{
// repeat until the reading index reaches the end of the character array
for(int read_index=1; read_index!=sizeof(charArray); ++read_index)
{
// if the current character or the previous character is not a space
if(charArray[read_index] != ' ' || charArray[read_index-1] != ' ')
{
// then write the character
charArray[write_index] = charArray[read_index];
++write_index;
}
}
}
Beachten Sie, dass charArray
hier eine sein muss nullterminierte Zeichenfolge, dh das letzte Zeichen ist '\0'
oder mit einem ganzzahligen Wert von 0
. Wir werden keine Zeichen vom Ende des Arrays löschen, nachdem ein Teil des Arrays überschrieben wurde. Aber wir kopieren das Zeichen 0
vom Ende an eine andere Position. Beispiel (N hier markiert die Position eines Null-Zeichen):
// array in the beginning:
" many spaces N"
// after all replaces:
" many spaces Npaces N"
cout
Aufruf oder string
Typen aus dem modifizierten Array Konstruktion wird das gewünschte Ergebnis liefern, weil alles, was nach dem Null-Zeichen wird abgeschnitten. Wenn Sie jedoch die Zeichen im Array nach dem Nullzeichen vollständig löschen möchten, müssen Sie ein neues Array mit der Größe write_index
erstellen und die Zeichen aus charArray
kopieren.
Wie diese Methode funktioniert, wurde in der Antwort "Interview Frage" beschrieben. Ich werde ein bisschen mehr erklären: Wir haben zwei Indizes: read_index
und write_index
. wird in jeder Iteration der Schleife inkrementiert, bestimmt die Position des Charakters in dem Array, das wir überprüfen. write_index
wird nur inkrementiert, wenn ein Zeichen "gespeichert" wird, und indem ich speichere, beziehe ich ein Überschreiben eines Zeichens, das wir bereits früher überprüft haben.
Wie Sie aus dem Code sehen können, wird ein Zeichen nur dann "gespeichert", wenn es kein Leerzeichen nach einem anderen Leerzeichen ist. Wenn wir also ein Leerzeichen im Array finden, speichern wir es immer noch, wenn das vorherige Zeichen kein Leerzeichen war. Aber wenn das vorherige Zeichen auch ein Leerzeichen war (und daher bereits gespeichert wurde), überspringen wir es. Daher haben wir im Ending-Array nur maximal ein zusammenhängendes Leerzeichen (natürlich nur unter Berücksichtigung der Zeichen vor dem ersten Null-Zeichen).
Mit 'regex' können Sie tun:' std :: regex_replace (some_string, std :: regex ("(\\ s +)"), ""); ' – DimChtz