2016-07-22 20 views
-1

Ich bin ein Anfänger Coder und ich habe nachgeschlagen und recherchiert, wie ich mehrere Leerzeichen in einem einzigen Raum entfernen kann, aber ich habe nicht verstanden, was jeder Algorithmus zu tun beabsichtigte . Ich habe auch versucht, ihre Algorithmen in mein Programm in Emacs zu implementieren, aber alles, was ich erhielt, waren Fehler, als ich sie debuggte.Entfernen mehrerer Leerzeichen in einem Raum zu einem Ausgabebildschirm durch emacs

Ich habe sah in Interview Question : Trim multiple consecutive spaces from a string und Replace multiple spaces with one space in a string aber ich hatte keinen Erfolg.

Das Bild zeigt, was ich versuche zu tun. Nehmen Sie die Zwischenräume zwischen cin und cout und wandeln Sie sie in eins um. enter image description here Ich habe bereits alles außer den mehreren Leerzeichen codiert.

Wenn jemand klar erklären kann, wie ich das tun kann, wäre es sehr geschätzt!

+0

Mit 'regex' können Sie tun:' std :: regex_replace (some_string, std :: regex ("(\\ s +)"), ""); ' – DimChtz

Antwort

0

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).