Exercise 3.6 - itoa with field width¶
Question¶
Write a version of itoa that accepts three arguments instead of two. The third argument is a minimum field width; the converted number must be padded with blanks on the left if necessary to make it wide enough.
#include <stdio.h>
#include <string.h>
#define MAXLIMIT 100
void reverse(char s[]) {
int i, j, c;
for (i = 0, j = strlen(s) - 1; i < j; i++, j--)
c = s[i], s[i] = s[j], s[j] = c;
}
void itoa(int n, char s[], int w) {
int i, sign;
if ((sign = n) < 0)
n = -n;
i = 0;
do {
s[i++] = (n % 10) + '0';
} while ((n /= 10) > 0);
if (sign < 0)
s[i++] = '-';
while (i < w)
s[i++] = ' ';
s[i] = '\0';
reverse(s);
}
int main(void) {
int number, width;
char str[MAXLIMIT];
number = -343565;
width = 10;
itoa(number, str, width);
printf("%s", str);
return 0;
}
Explanation¶
Note: For negative numbers the negative sign is written close to the number
instead of before the padded width. This is itoa
conversion with padding. We
specify the width of the number we want in w
and as before, we proceed with
itoa
, wherein extract the unit digit (n % 10
), convert it to character and
store it in a character array. If it were a negative number we store the sign
too. We keep track of number of digits in the number in a variable, i
and for
the remaining digits, for i < w
, we append the space character “ “.
We reverse the string thus constructed for our result.