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.
/* a function of itoa, which accepts the third argument as the width of the
number. the string representation is padded with blanks in the left to get the
required width */
#include <stdio.h>
#include <string.h>
#define MAXLIMIT 100
void itoa(int n, char s[], int w);
void reverse(char s[]);
int main(void) {
int number, width;
char str[MAXLIMIT];
number = -343565;
width = 10;
itoa(number, str, width);
printf("%s", str);
return 0;
}
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);
}
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;
}
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.