38

Is there a way to have a variable sized padding in printf?

I have an integer which says how large the padding is:

void foo(int paddingSize) {
    printf("%...MyText", paddingSize);
}

This should print out ### MyText where the paddingSize should decide the number of '#' symbols.

5 Answers 5

68

Yes, if you use * in your format string, it gets a number from the arguments:

printf ("%0*d\n", 3, 5);

will print "005".

Keep in mind you can only pad with spaces or zeros. If you want to pad with something else, you can use something like:

#include <stdio.h>
#include <string.h>
int main (void) {
    char *s = "MyText";
    unsigned int sz = 9;
    char *pad = "########################################";
    printf ("%.*s%s\n", (sz < strlen(s)) ? 0 : sz - strlen(s), pad, s);
}

This outputs ###MyText when sz is 9, or MyText when sz is 2 (no padding but no truncation). You may want to add a check for pad being too short.

Sign up to request clarification or add additional context in comments.

2 Comments

Sorry, @Debanjan, I missed one of the * characters. The new version has been checked more thoroughly.
why does char *pad, has to be so long? I mean ins't it limited by the final output string length
2

You could write like this :

void foo(int paddingSize) {
       printf ("%*s",paddingSize,"MyText");
}

Comments

0
printf( "%.*s", paddingSize, string );

For example:

const char *string = "12345678901234567890";
printf( "5:%.*s\n", 5, string );
printf( "8:%.*s\n", 8, string );
printf( "25:%.*s\n", 25, string );

displays:

5:12345
8:12345678
25:12345678901234567890

Comments

-1

Be careful though - some compilers at least (and this may be a general C thing) will not always do what you want:

char *s = "four";
printf("%*.s\n", 5, s); // Note the "."

This prints 5 spaces;

char *s = "four";
printf("%*s\n", 3, s);  // Note no "."

This prints all four characters "four"

1 Comment

This is an error in code, not anything else. The . is precision and is supposed to be followed by either * or an optional decimal integer, which you're not doing. It is not clear to me what you're trying to do with the example because it is incorrect code. I suggest you read the man page or if you can find a copy of the standard it's also there. Yes printf(3) and scanf(3) families are complicated.
-2

better use std::cout

#include<iomanip>
#include<iostream>
using namespace std;
cout << setw(9)                       //set output width
     << setfill('#')                  // set fill character
     << setiosflags(ios_base::right)  //put padding to the left
     << "MyText";

should produce:

###MyText

1 Comment

I don't like down-voting and I did not but the reason likely that you were down-voted is this is C, not C++. This will NOT work and is entirely incorrect as it is not the same language. Also, using namespace std; is frowned upon as it causes a lot of problems. But that's just an irrelevant aside.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.