Icon Ressource

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

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.
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
Autor
german
Aufrufe
1.076
Erstellt am
Letzte Bearbeitung
Bewertung
0,00 Stern(e) 0 Bewertung(en)

Weitere Ressourcen von german

Oben Unten