Die Trim Funktion kann hilfreich sein, wenn Strings voran- und/oder nachgestellte Zeichen (oft sind dies Leerzeichen) enthält, die bei anderer Operationen stören.
Die Funktion führt diese Änderungen im übergeben String durch, der also nicht konstant sein darf.
Ausgabe:
Die Funktion führt diese Änderungen im übergeben String durch, der also nicht konstant sein darf.
C:
#include <stdio.h>
#include <string.h> // Trim
#include <stdbool.h> // Trim
/** \brief Entfernt spezifizierte voran- und/oder nachgestellte Zeichen von einem String.
* \param str Zu verändernder String.
* \param charList String von Zeichen, die als führende oder angehängte Zeichen entfernt werden sollen.
* \param mode Flags, die spezifizieren, ob voran- und/oder nachgestellte Zeichen entfernt werden sollen.
* 1 um vorangestellte Zeichen zu entfernen
* 2 um nachgestellte Zeichen zu entfernen
* \param pLen Adresse eines Speicherbereichs, in den die Stringlänge nach dem Trim geschrieben wird.
* darf NULL sein
* \return false bei Fehler, sonst true */
bool Trim(char *const str, const char *const charList, const unsigned mode, size_t *const pLen)
{
size_t len = 0U; // Stringlänge.
if (str) // Stringlänge ermitteln.
len = strlen(str);
if (pLen) // Ggf. Stringlänge zuweisen.
*pLen = len;
if (!str || !charList) // Plausibilitätsprüfung
return false; // Bei Fehler, raus hier.
char *it = NULL; // Iterator.
if (mode & 2) // Trim rechts.
{
for (
it = str + len; // Der Iterator zeigt auf die Nullterminierung.
it > str && strpbrk(it - 1, charList) == it - 1; // Solange der Iterator noch nicht auf den Stringanfang verweist und das erste gefundene Zeichen das erste Zeichen des Teilstrings ist auf den der dekrementierte Iterator zeigt ...
--it // ... den Iterator dektementieren.
);
*it = '\0'; // Nullterminierung setzen.
len = (size_t)(it - str); // Stringlänge berechnen.
}
if (!len) // Wenn die Stringlänge 0 ist ...
{
if (pLen) // ... ggf. Stringlänge zuweisen ...
*pLen = 0U;
return true; // ... OK und beenden.
}
if (mode & 1) // Trim links.
{
for (
it = str; // Dem Iterator wird der Pointerwert des Stringanfangs zugewiesen.
strpbrk(it, charList) == it; // Solange das erste gefundene Zeichen das erste Zeichen des Teilstrings ist auf den der Iterator zeigt ...
++it // ... Iterator inkrementieren.
);
if (str != it) // Ggf. Länge aktualisieren und neuen Teilstring an den Anfang des Speicherbereichs kopieren
{
len -= (size_t)(it - str);
memmove(str, it, len + 1U); // Das +1 ist für die Nullterminierung, die mit verschoben werden muss.
}
}
if (pLen) // Ggf. Stringlänge zuweisen.
*pLen = len;
return true; // OK und beenden.
}
int main(void)
{
char text[] = " \"Hello World!\" "; // Beispielstring
size_t len = 0U; // Neue Stringlänge
bool ret = false; // Rückgabewert der Trim Funktion
printf("Ausgangsstring: '%s'\n\n", text);
ret = Trim(
text, // String, der von der Trim Funktion verändert wird
" \"", // Zeichen, die entfernt werden sollen (beispielhaft Leer- und Anführungszeichen)
1 | 2, // voran- und nachgestellte Zeichen entfernen
&len // Adresse der Variablen für die neue Stringlänge
);
if (ret == true)
printf("Veraenderter String: '%s'\nNeue Laenge: %u\n", text, (unsigned)len);
else
fputs("Fehler!\n", stderr);
return 0;
}
Ausgabe:
Code:
Ausgangsstring: ' "Hello World!" '
Veraenderter String: 'Hello World!'
Neue Laenge: 12