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.
Es ist im Grunde ein optimierter Code (in Bezug auf Geschwindigkeit und Code-Größe).
Wenn wir Speicherplatz benötigen,
%Vor% 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.
Wenn Sie unter Linux / Windows arbeiten und die Bibliothek glib in Ihr Programm eingebunden haben, können Sie die Routine g_strstrip()
.
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%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:
%Vor%7.31.13 Stringbehandlung
<string.h>
1 Funktionsnamen, die mit
str
,mem
oderwcs
beginnen, und ein Kleinbuchstabe können hinzugefügt werden zu den Deklarationen im Header<string.h>
.
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).