Icon Ressource

[C] StrFix Funktion - String auf eine fixe Länge erweitern oder einkürzen

Die StrFix Funktion führt ein Padding am Anfang und/oder Ende eines Strings aus. Der veränderte String wird in ein übergebenes Pufferarray geschrieben.
Anwendungsmöglichkeit könnte bspw. die zentrierte Ausgabe eines Textes sein.
C:
#include <stdio.h>
#include <string.h> // StrFix
#include <stdbool.h> // StrFix

/** \brief  String durch Padding auf eine feste Länge erweitern oder auf eine feste Länge einkürzen.
 * \param  str     Eingangs-String.
 * \param  buffer  Puffer für den Ausgabestring, mit mindestens der Größe für die Länge des Ausgabestrings + 1
 * \param  length  Länge des Ausgabestrings im Puffer
 * \param  padStr  String von Zeichen, die für ein Padding verwendet werden
 *                   Im Fall, dass der Eingangs-String eingekürzt werden soll, darf dieser Parameter NULL sein
 * \param  mode    Flags, die spezifizieren, auf welcher Seite das Padding oder Einkürzen erfolgen soll
 *                   1 linke Seite
 *                   2 rechte Seite
 *                   Die Kombination aus beiden Flags (1|2) führt zum Zentrieren
 * \return false bei Fehler, sonst true */
bool StrFix(const char *const str, char *const buffer, const size_t length, const char *const padStr, const unsigned mode)
{
  if (!str || !buffer) // Plausibilitätsprüfung
    return false; // Bei Fehler, raus.

  const size_t strLen = strlen(str); // Länge des Eingangs-Strings
  const long long padLen = padStr ? (long long)strlen(padStr) : 0LL, // Falls nicht NULL übergeben wurde Länge des Pad-Strings ermitteln
                  diff = (long long)((unsigned long long)length - strLen); // Differenz von Soll-Länge und Stringlänge ermitteln
  if (diff > 0LL && !padLen) // Falls ein Padding nötig ist, aber keine Zeichen für ein Padding übergeben wurden ...
    return false; // ... Fehler und raus

  // Anzahl hinzuzufügender oder zu entfernender Zeichen links in Abhängigkeit vom Modus
  const long long padLenL = (mode & 1 && mode & 2) ? diff >> 1 : ((mode & 1) ? diff : 0LL);

  if (diff <= 0LL) // Wenn die Soll-Länge kürzer oder gleich der Stringlänge ist ...
  {
    strncpy(buffer, str - padLenL, length); // ... Teilstring kopieren ...
    buffer[length] = '\0'; // ... Nullterminierung setzen ...
    return true; // OK und beenden
  }

  char *bufIt = buffer; // Iterator auf den Puffer
  const char *padIt = padStr, // Iterator auf den Pad-String
             *const endpad = padStr + padLen; // Pointer auf die Nullterminierung des Pad-Strings
  for (char *endL = bufIt + padLenL; bufIt < endL; ++bufIt) // Für jede Paddingposition links ...
  {
    *bufIt = *padIt; // Zeichen aus dem Pad-String zuweisen
    if (++padIt == endpad) // Falls das Ende des Pad-Strings erreicht wurde, wieder zurück auf den Anfang springen
      padIt = padStr;
  }

  strncpy(bufIt, str, strLen + 1); // String hinzu kopieren
  bufIt += strLen; // Iterator auf das Stringende setzen
  padIt = padStr;
  for (char *endR = bufIt + diff - padLenL; bufIt < endR; ++bufIt) // Für jede Paddingposition rechts ...
  {
    *bufIt = *padIt; // Zeichen aus dem Pad-String zuweisen
    if (++padIt == endpad) // Falls das Ende des Pad-Strings erreicht wurde, wieder zurück auf den Anfang springen
      padIt = padStr;
  }

  *bufIt = '\0'; // Nullterminierung setzen
  return true; // OK und beenden
}

int main(void)
{
  const char str[] = "Hello World!"; // Beispielstring
  char buffer[512] = {0}; // Puffer für den Ausgebestring
  bool ret = false; // Rückgabewert

/* ~~~~~~~~~~~~~~ 1 ~~~~~~~~~~~~~~ */
  ret = StrFix(
          str, // Eingangs-String
          buffer, // Puffer
          6, // auf sechs Zeichen einkürzen
          NULL, // es werden keine Padding-Zeichen benötigt
          1 // links einkürzen
        );

  if (ret == true)
    printf("'%s'\n\n", buffer);
  else
    puts("Fehler!");

/* ~~~~~~~~~~~~~~ 2 ~~~~~~~~~~~~~~ */
  ret = StrFix(
          str, // Eingangs-String
          buffer, // Puffer
          25, // auf 25 Zeichen erweitern
          " ", // Padding durch Leerzeichen
          2 // Padding rechts
        );

  if (ret == true)
    printf("'%s'\n\n", buffer);
  else
    puts("Fehler!");

/* ~~~~~~~~~~~~~~ 3 ~~~~~~~~~~~~~~ */
  ret = StrFix(
          str, // Eingangs-String
          buffer, // Puffer
          25, // auf 25 Zeichen erweitern
          "-.", // Padding durch Minus und Punkt
          1 | 2 // Padding auf beiden Seiten zentriert
        );

  if (ret == true)
    printf("'%s'\n\n", buffer);
  else
    puts("Fehler!");


  return 0;
}

Ausgabe:
Code:
'World!'

'Hello World!             '

'-.-.-.Hello World!-.-.-.-'
Autor
german
Aufrufe
2.487
Erstellt am
Letzte Bearbeitung
Bewertung
0,00 Stern(e) 0 Bewertung(en)

Weitere Ressourcen von german

Zurück
Oben Unten