Dla „C” istnieje alternatywne (bardziej złożone) użycie [s] printf, które nie wymaga żadnego malloc () ani wstępnego formatowania, gdy pożądane jest niestandardowe wypełnienie.
Sztuczka polega na użyciu specyfikatorów długości „*” (min i max) dla% s oraz łańcucha wypełnionego znakiem dopełniającym do maksymalnej potencjalnej długości.
int targetStrLen = 10;
const char *myString="Monkey";
const char *padding="#####################################################";
int padLen = targetStrLen - strlen(myString);
if(padLen < 0) padLen = 0;
printf("[%*.*s%s]", padLen, padLen, padding, myString);
printf("[%s%*.*s]", myString, padLen, padLen, padding);
"% *. * S" można umieścić przed lub po "% s", w zależności od potrzeby dopełnienia LEWEGO lub PRAWEGO.
[####Monkey] <-- Left padded, "%*.*s%s"
[Monkey####] <-- Right padded, "%s%*.*s"
Zauważyłem, że PHP printf ( tutaj ) obsługuje możliwość nadania niestandardowego znaku wypełnienia, używając pojedynczego cudzysłowu ('), po którym następuje niestandardowy znak wypełnienia , w formacie% s.
printf("[%'#10s]\n", $s); // use the custom padding character '#'
produkuje:
[####monkey]