Bester Algorithmus zum Entfernen von führenden und abschließenden Leerzeichen in C [duplizieren]

7

Was ist der beste Ansatz beim Entfernen von führenden und abschließenden Leerzeichen in C?

    
ksuralta 09.12.2008, 07:51
quelle

16 Antworten

5

Sie können dies vollständig an Ort und Stelle tun.

%Vor%     
AlfaZulu 09.12.2008, 08:32
quelle
21

Hier ist, wie der Linux-Kernel das Trimmen ausführt: strstrip ():

%Vor%

Es ist im Grunde eine besser formatierte und fehlerüberprüfte Version, was das vorherige Poster gesagt hat.

    
Tuminoid 09.12.2008 08:27
quelle
9

Diese Frage sieht so aus, als ob es sich um eine Hausaufgabenfrage handeln könnte, also antworte ich schräg: Suche die man-Seiten nach isspace (3) und strlen (3) ab und benutze Zeigerarithmetik. Je nach Problem können Sie auch malloc (3) benötigen, um Platz für das Ergebnis zu haben.

Vergessen Sie nicht, dass die Darstellung einer C-Zeichenfolge ein nachkommendes 0-Byte enthält, das oft '\ 0' geschrieben wird und nicht als Teil der Länge der Zeichenfolge gezählt wird.

    
Norman Ramsey 09.12.2008 08:03
quelle
7

Hier ist eine Version mit isspace:

%Vor%     
Johannes Schaub - litb 09.12.2008 08:52
quelle
3
%Vor%

Es ist im Grunde ein optimierter Code (in Bezug auf Geschwindigkeit und Code-Größe).

Wenn wir Speicherplatz benötigen,

%Vor%     
lakshmanaraj 09.12.2008 09:19
quelle
3

Hier ist eine prägnante und sicherere Version von lakshmanarajs erster Funktion:

%Vor%     
anon 05.01.2009 09:52
quelle
2

Eine Verfeinerung eines anderen obigen Beitrags.

%Vor%     
Enlightenment 06.01.2011 03:20
quelle
2

Für diejenigen, die eine rekursive Lösung sehen möchten, biete ich folgendes an:

%Vor%

Natürlich ist es nicht die einzig mögliche rekursive Lösung.

    
Indinfer 26.06.2013 00:10
quelle
1
%Vor%

Das sollte sich um das Problem kümmern, solange Sie nicht daran interessiert sind, die Kette wie verrückt aufzumisten und wenn Sie sich nicht um Speicherlecks kümmern!

    
mcjabberz 09.12.2008 08:04
quelle
1

Sie sollten es in-Place machen können; Das Entfernen von Leerzeichen kann niemals dazu führen, dass die Zeichenfolge wächst. Möglicherweise können Sie dies tun, ohne zuerst die Länge der Zeichenfolge zu überprüfen, aber dies könnte unnötig "clever" sein. Sie sollten in die Funktion memmove() schauen, zusätzlich zu den @Norman Ramsey genannten.

    
unwind 09.12.2008 08:10
quelle
1

Wenn Sie unter Linux / Windows arbeiten und die Bibliothek glib in Ihr Programm eingebunden haben, können Sie die Routine g_strstrip() .

    
Ben Combee 05.01.2009 06:08
quelle
1
%Vor%     
Rajendra 17.01.2014 19:26
quelle
1

Korrigierter Algorithmus von fpsgamer (auch ISO C90 gültig):

%Vor%     
R.H. 22.04.2014 23:22
quelle
1

für nachfolgende Leerzeichen verwenden Sie strtok. setze das delimiter="" und wenn es ausgeführt wird, verwirft es das Delimiter-Byte und gibt char * an das Token

zurück %Vor%

result x = Zeiger auf "somestring" nicht "somestring"

    
JamesAD-0 16.10.2015 20:27
quelle
1

Bearbeiten: Der Code wurde basierend auf der neuesten Version der zString-Bibliothek aktualisiert.

Dieser Code stützt sich auf keine Bibliotheken, nur Zeigerarithmetik und Ganzzahlen. Es gibt drei Funktionen: trim, lef-trim und right-trim. (Ich sollte alle diese Funktionen in zString-Bibliothek hinzufügen :))

  • char *zstring_trim(char *s) entfernt führende und nachfolgende Leerzeichen

  • char *zstring_ltrim(char *s) entfernt führende weiße Leerzeichen

  • char *zstring_ltrim(char *s) entfernt nachfolgende weiße Leerzeichen

Alle diese Funktionen ändern die ursprüngliche Zeichenkette

%Vor%     
Fehmi Noyan ISI 25.02.2016 02:05
quelle
1

Hinzufügen einer weiteren Antwort auf ein bereits überfülltes Feld, aber ... ich glaube aus gutem Grund. Insbesondere die (derzeit akzeptierte) Antwort von AlfaZulu entfernt keine nachgestellten Leerzeichen und beachtet auch nicht die Grenzen der Arrays. Valgrind meldet Out-of-Bounds liest und schreibt, wenn die Quellzeichenfolge eine leere Zeichenfolge ist.

Hier ist ein Beispielcode mit der Funktion stripLeadingAndTrailingSpaces() aus AlfaZulu's Antwort (einschließlich der abschließenden Leerzeichen) - mit nur dem static davor hinzugefügt, um meinen Vorurteilen zu entsprechen. (Ich verwende Compiler-Optionen, die die Code-Kompilierung verhindern, es sei denn, es gibt entweder einen Prototyp für die Funktion oder die Funktion ist statisch). Es gibt auch eine Funktion str_strip() , die eine feste Version der Funktion von AlfaZulu ist. Der Prüfkabelbaum stellt die zwei Funktionen zur Verfügung. Der Code nimmt eine POSIX-ähnliche Umgebung an, in der strdup() verfügbar ist, um eine doppelte Kopie einer Zeichenfolge zuzuordnen.

Beachten Sie, dass der Name str_strip() einen Konflikt mit den reservierten Namen für die Standard-C-Bibliothek vermeidet:

  

7.31.13 Stringbehandlung <string.h>

     

1 Funktionsnamen, die mit str , mem oder wcs beginnen, und ein Kleinbuchstabe können hinzugefügt werden   zu den Deklarationen im Header <string.h> .

%Vor%

Wenn ich unter Valgrind laufe, bekomme ich die Ausgabe:

%Vor%

Die gezeigte Funktion str_strip() funktioniert korrekt. Es enthält einen mehr oder weniger minimalen Satz von Änderungen, die notwendig sind, damit stripLeadingAndTrailingSpaces() sauber arbeitet (plus auskommentierter Debug-Code, der während des Prüfprozesses verwendet wurde - der jetzt gehen könnte).

Ich beobachte, dass, obwohl es etwas andere Semantik hat, die Linux-basierte Funktion strstrip() von Tuminoid 's ist Eine href="https://stackoverflow.com/a/352109/15168"> Antwort ist ebenfalls sauber - keine Speicherzugriffsfehler und es entfernt nachgestellte Leerzeichen (ohne den Teil der Zeichenkette zwischen dem ersten und dem zweiten Teil zu verschieben) letzte nicht leere Zeichen).

    
Jonathan Leffler 10.08.2017 17:41
quelle

Tags und Links