Resource icon

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

Programmiersprache(n)
C (ANSI, abwärtskompatibel)
Betriebssystem(e)
unspezifisch
Anwendung könnte bspw. die zentrierte Ausgabe eines eingelesenen Texts sein.
C:
#include <stdio.h>
#include <string.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 int     1 bei Fehler, sonst 0
*/
int StrFix(const char *const str, char *const buffer, const size_t length, const char *const padstr, const unsigned mode)
{
  long long cntstr = 0, // Länge des Eingangs-Strings
            cntpad = 0, // Länge des Pad-Strings
            diff = 0, // Differenz von Soll-Länge und Stringlänge
            lenpad_l = 0, // Anzahl hinzuzufügender oder zu entfernender Zeichen links
            lenpad_r = 0, // Anzahl hinzuzufügender oder zu entfernender Zeichen rechts
            i = 0; // Schleifenindex
  char *itbuf = buffer; // Iterator auf den Puffer

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

  cntstr = strlen(str); // Länge des Eingangs-Strings ermitteln
  cntpad = padstr ? strlen(padstr) : 0;// Falls nicht NULL übergeben wurde Länge des Pad-Strings ermitteln
  diff = (long long)length - cntstr; // Differenz von Soll-Länge und Stringlänge ermitteln

  if (diff > 0 && !cntpad) // Falls ein Padding nötig ist, aber keine Zeichen für ein Padding übergeben wurden ...
    return 1; // ... Fehler und raus

  // Anzahl hinzuzufügender oder zu entfernender Zeichen links in Abhängigkeit vom Modus berechnen
  if (mode & 1 && mode & 2)
    lenpad_l = (diff > 0 && diff & 1) ? diff / 2 + 1 : diff / 2;
  else if (mode & 1)
    lenpad_l = diff;

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

  for (; i < lenpad_l; ++i, ++itbuf) // Für jede Paddingposition links ...
    *itbuf = *(padstr + (i % cntpad)); // Zeichen aus dem Paddingstring zuweisen

  strncpy(itbuf, str, (size_t)cntstr); // String hinzu kopieren
  itbuf += cntstr; // Iterator auf das Stringende setzen
  lenpad_r = diff - lenpad_l; // Anzahl hinzuzufügender Zeichen rechts berechnen

  for (i = 0; i < lenpad_r; ++i, ++itbuf) // Für jede Paddingposition rechts ...
    *itbuf = *(padstr + (i % cntpad)); // Zeichen aus dem Paddingstring zuweisen

  *itbuf = 0; // Nullterminierung setzen
  return 0; // OK und beenden
}



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

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

  if (ret == 0)
    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 == 0)
    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 == 0)
    printf("'%s'\n\n", buffer);
  else
    puts("Fehler!");


  return 0;
}
Ausgabe:
Code:
'World!'

'Hello World!             '

'-.-.-.-Hello World!-.-.-.'
Autor
German
First release
Last update
Bewertung
0,00 Stern(e) 0 Bewertungen
Oben