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.
Ausgabe:
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!-.-.-.-'