> %n takes a pointer and writes (!!) the number of bytes printed so far.
> Okay, everyone probably knows this. Let's get a bit more advanced.
Ok, but I didn't know about that. What's the use?
> Okay, everyone probably knows this. Let's get a bit more advanced.
Ok, but I didn't know about that. What's the use?
char *prefix = "example";
char *line1 = "line 1";
char *line2 = "line 2";
printf("%s: %n%s\n", prefix, &n, line1);
printf("%*s%s\n", n, "", line2);
will output example: line 1
line 2
That’s a bit more robust than using strlen(s)+2, where you have to keep that magic constant 2 in sync with ": ". Moving ": " to a variable and using strlen(s)+strlen(separator) would fix that, though (at the price of speed, unless you’ve a compiler that optimizes that away) n = printf("%s: ", prefix);
printf("%s\n", line1);
printf("%*s%s\n", n, " ", line2);strlen wouldn't even be an option if you were formatting something that's not a string e.g.
int n;
int prefix_num = 23;
char *line1 = "line 1";
char *line2 = "line 2";
printf("example %d: %n%s\n", prefix_num, &n, line1);
printf("%*s%s\n", n, "", line2);I think the feature predates that and Unicode, though. But even then, it fails if you underline text the way it was done at the time, either by using backspace and underline characters or by using termcap (https://en.wikipedia.org/wiki/Termcap)
And we did something with it involving string translations. Since we didn't control the translated format string we couldn't just count the characters in the source code.
But it's been a really long time and I don't recall the details.