# 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.