Можно и ширину поля, и точность под звёздочку дать и передавать число, причём отрицательное число работает "как положено"
#include <stdio.h>
const char s[] = "123456";
int main()
{
for( int width = -15; width <= 15; width += 30)
for( int maxlen = 1; maxlen <= 7; ++maxlen)
printf( "'%*.*s'\n", width, maxlen, s);
return 0;
}
'1 '
'12 '
'123 '
'1234 '
'12345 '
'123456 '
'123456 '
' 1'
' 12'
' 123'
' 1234'
' 12345'
' 123456'
' 123456'