Umkehr der Wortfolge in einer Zeichenfolge an Ort und Stelle

8

Ich versuche die Reihenfolge der Wörter in einem Satz umzukehren, zB:

  

Diese Sätze sind umgekehrt.

wird

  

umgekehrt. sind Wörter Sätze This

Das habe ich bisher, was fast funktioniert: Ich benutze die strrev-Funktion, um die Zeichenfolge umzukehren, und dann die inprev-Funktion, um jedes Wort einzeln an die strrev-Funktion zu senden, um sie in die ursprüngliche Ausrichtung zurückzuversetzen, jedoch in umgekehrter Reihenfolge. Das Senden eines Zeigers für den Anfang und das Ende der strrev-Funktion mag etwas albern erscheinen, aber es ermöglicht die Verwendung derselben Funktion in inprev (), wobei ein Zeiger auf den Anfang und das Ende einzelner Wörter gesendet wird.

%Vor%

Hier ist die Ausgabe:

  

Foobar meine Freunde, Foobar

     

raboof, sdneirf ym rabooF

     

foobarfriends, mein Foobar

Das Problem ist, dass das Fehlen eines letzten Platzes am Ende des letzten Wortes bedeutet, dass ein Leerzeichen zwischen diesem Wort und dem vorhergehenden in der letzten Zeichenfolge fehlt und stattdessen auf das Ende des letzten Wortes geworfen wird. Das war das erste Wort in der ursprünglichen Zeichenfolge. Das Senden des Speicherplatzes auf der anderen Seite des Wortes verschiebt das Problem nur anderswo. Kann jemand eine Lösung sehen?

    
Matt 31.08.2011, 07:50
quelle

4 Antworten

5

Sie müssen nur den Zeiger start in der Funktion inprev verschieben, um den Abstand zwischen den Wörtern zu überspringen. Da es sich um Hausaufgaben handelt (korrigiere mich, wenn ich falsch liege), sage ich einfach, dass du nur den Standort eines Bedieners verschieben musst.

Dies führt jedoch zu einem Problem, nämlich dass inprev einen Pufferüberlauf ausführt, weil die Suche nicht ordnungsgemäß beendet wird. Ein besserer Weg, es zu tun ist:

%Vor%

und das wird sich auch um mehrere Räume kümmern. Außerdem ist U + 0020 (ASCII 32, ein Leerzeichen) nicht das einzige Leerzeichen. Es gibt Standardbibliotheksfunktionen, die Zeichen testen. Sie sind in & lt; ctype.h & gt; und beginne mit is... , z.B. isspace .

    
Skizz 31.08.2011, 08:01
quelle
1

Manchmal wird es einfacher, wenn Sie keine Zeiger, sondern Offsets verwenden. Die Bibliotheksfunktionen strspn () und strcspn () zwingen Sie mehr oder weniger dazu, Offsets zu verwenden, und mit der End-of-String-Bedingung ziemlich gut umgehen.

%Vor%     
wildplasser 01.09.2011 11:27
quelle
0

habe eine Lösung gefunden; Hier ist meine überarbeitete Funktion, die richtig funktioniert.

%Vor%

char * wordend ist nicht notwendig, da Sie einfach str-1 an die strrev-Funktion übergeben können, aber es macht es ein wenig klarer, was passiert.

    
Matt 31.08.2011 21:21
quelle
0

Der folgende Algorithmus ist in-place und läuft in 2 Schritten. Zuerst kehrt er die gesamte Saite um. Dann kehrt es jedes Wort um.

%Vor%     
Diego Giagio 04.09.2013 19:35
quelle

Tags und Links