Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Decoding printf statements in C (Printf Primer)

Tags:

c

printf

qt

qstring

I'm working on bringing some old code from 1998 up to the 21st century. One of the first steps in the process is converting the printf statements to QString variables. No matter how many times I look back at printf though, I always end up forgetting one thing or the other. So, for fun, let's decode it together, for ole' times sake and in the process create the first little 'printf primer' for Stackoverflow.

In the code, I came across this little gem,

printf("%4u\t%016.1f\t%04X\t%02X\t%1c\t%1c\t%4s", a, b, c, d, e, f, g);

How will the variables a, b, c, d, e, f, g be formatted?

like image 952
CodingWithoutComments Avatar asked Dec 04 '22 16:12

CodingWithoutComments


2 Answers

Danny is mostly right.

a. unsigned decimal, minimum 4 characters, space padded
b. floating point, minimum 16 digits before the decimal (0 padded), 1 digit after the decimal
c. hex, minimum 4 characters, 0 padded, letters are printed in upper case
d. same as above, but minimum 2 characters
e. e is assumed to be an int, converted to an unsigned char and printed
f. same as e
g. This is likely a typo, the 4 has no effect. If it were "%.4s", then a maximum of 4 characters from the string would be printed. It is interesting to note that in this case, the string does not need to be null terminated.

Edit: jj33 points out 2 errors in b and g above here.

like image 174
Jason Day Avatar answered Dec 06 '22 07:12

Jason Day


@Jason Day, I think the 4 in the last %4s is significant if there are fewer than 4 characters. If there are more than 4 you are right, %4s and %s would be the same, but with fewer than 4 chars in g %s would be left justified and %4s would be right-justified in a 4 char field.

b is actually minimum 16 chars for the whole field, including the decimal and the single digit after the decimal I think (16 total chars vs 18 total chars)

like image 21
jj33 Avatar answered Dec 06 '22 05:12

jj33