Resource icon

[C] Trim Funktion - Entfernt spezifizierte voran- und/oder nachgestellte Zeichen eines Strings.

Programmiersprache(n)
C (ANSI, abwärtskompatibel)
Betriebssystem(e)
unspezifisch
C:
#include <stdio.h>
#include <string.h> // Trim


/** \brief  Entfernt spezifizierte voran- und/oder nachgestellte Zeichen eines Strings.
*
*  \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 int       1 bei Fehler, sonst 0
*/
int Trim(char *const str, const char *const charlist, const unsigned mode, size_t *const pLen)
{
  size_t len = 0; // Stringlänge.
  char *it = str; // Iterator.

  if (str) // Stringlänge ermitteln.
    len = strlen(str);

  if (pLen) // Ggf. Stringlänge zuweisen.
    *pLen = len;

  if (!str || !charlist || !mode || mode > 0x3) // Plausibilitätsprüfung
    return 1; // Bei Fehler, raus hier.

  if (mode & 1) // Trim links.
    for (
      ; // Dem Iterator wurde bereits der Pointerwert des Strings zugewiesen.
      strpbrk(it, charlist) == it; // Solange das erste gefundene Zeichen das erste Zeichen des Teilstrings ist auf den der Iterator zeigt ...
      ++it, --len // ... Iterator inkrementieren und Stringlänge dekrementieren.
    );

  if (str != it) // Ggf. neuen Teilstring an den Anfang des Speicherbereichs kopieren
    memmove(str, it, len + 1);

  if (!len) // Wenn die Stringlänge 0 ist ...
  {
    if (pLen) // ... ggf. Stringlänge zuweisen ...
      *pLen = 0;
    return 0; // ... OK und beenden.
  }

  if (mode & 2) // Trim rechts.
    for (
      it = str + len - 1; // Der Iterator zeigt auf das letzt Zeichen im String.
      it >= str && strpbrk(it, charlist) == it; // Solange der Iterator noch nicht auf ungültigen Speicher verweist und das erste gefundene Zeichen das erste Zeichen des Teilstrings ist auf den der Iterator zeigt ...
      *(it--) = 0, --len // ... das gefundene Zeichen durch eine Nullterminierung ersetzen, sowie den Iterator und die Stringlänge dektementieren.
    );

  if (pLen) // Ggf. Stringlänge zuweisen.
    *pLen = len;

  return 0; // OK und beenden.
}



int main(void)
{
  char text[] = "  \"Hello World!\"  "; // Beispielstring
  size_t len = 0;                       // Neue Stringlänge
  int ret = 0;                          // 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 == 0)
    printf("Veraenderter String: '%s'\nNeue Laenge:         %u\n", text, len);
  else
    fputs("Fehler!\n", stderr);

  return 0;
}
Ausgabe:
Code:
Ausgangsstring:      '  "Hello World!"  '

Veraenderter String: 'Hello World!'
Neue Laenge:         12
Autor
German
First release
Last update
Bewertung
0,00 Stern(e) 0 Bewertungen
Oben