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.

Visualize It

Run It