So, I'm a bit stymied. According to man 3 printf
on my system, the string format "%5s"
should use the specified precision to limit the number of characters printed from the string argument given.
% man 3 printf PRINTF(3) BSD Library Functions Manual PRINTF(3) NAME printf, fprintf, sprintf, snprintf, asprintf, vprintf, vfprintf, vsprintf, vsnprintf, vasprintf -- formatted output conversion ... s The char * argument is expected to be a pointer to an array of character type (pointer to a string). Characters from the array are written up to (but not including) a terminating NUL charac- ter; if a precision is specified, no more than the number specified are written. If a precision is given, no null character need be present; if the precision is not specified, or is greater than the size of the array, the array must contain a terminating NUL character.
But my test code doesn't confirm this:
#include <stdio.h>
int main()
{
char const * test = "one two three four";
printf("test: %3s\n", test);
printf("test: %3s\n", test+4);
printf("test: %5s\n", test+8);
printf("test: %4s\n", test+14);
return 0;
}
It outputs
test: one two three four test: two three four test: three four test: four
When I think I should be getting
test: one test: two test: three test: four
Am I doing something wrong, or is the man page just lying to me?
FYI: I know I could (in general) hack the string, and insert temporary '\0'
to terminate the string (except when it's a char const *
, like here, I'd have to copy it instead), but it's a PITA (especially if I'm trying to print two halves of something in the same printf), and I want to know why the precision is being ignored.
You're not setting the precision, you're setting the field width. The precision always starts with a .
in the format specification.
printf("test: %.3s\n", test);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With