Pointer version of itoa

Rewrite appropiate programs from earlier chapters and exercises with pointers instead of array indexing. Good posibilities include getline(Chapter 1 and 4), atoi, itoa, and their variants(Chapters 2, 3, and 4), reverse(Chapter 3), and strindex and getop(Chapter 4)

Here is my solution:

static char *hidden(int n, char *s) {
char *p;

if(n / 10) {
p = hidden(n / 10, s);
}
else {
p = s;

}
*p++ = n % 10 + '0';
*p = '\0';

return p;
}

char *itoa(int n, char *s) {
if(n < 0) {
*s = '-';
hidden(-n, s + 1);
}
else {
hidden(n, s);
}

return s; /* pointer to first char of s*/
}


itoa is a wrapper for the function hidden. The function hidden returns a pointer to the next free slot in the array s. At the deepest level of recursion it returns a pointer to the first element (the else branch) of the array.

• I think that this is the most relevant function that needs pr, the other ones are quite simple. If you want to see them: drive.google.com/… – cristid9 Feb 5 '14 at 14:48
• Please give a better name (and some explanatory comments) to your hidden function. It's hard to tell what the function does. – Brennan Vincent Feb 5 '14 at 15:25
• There is absolutely no reason to use recursion for this. It is hard to read, inefficient and dangerous. I think the classic K&R implementation of this algorithm is hard to beat in terms of efficiency. (But of course, K&R code is always an unreadable mess, filled with dangerous programming practice, so that snippet would need a code review of its own.) – Lundin Feb 6 '14 at 14:04

The standard version of itoa takes a parameter named base (which you have assumed is 10).

You probably don't need a second hidden function; this would do instead:

if (n < 0)
{
*s++ = '-';
n = -n;
}
// ... itoa implementation continues here ...


Recursing is clever; you could also probably do it with two loops instead (untested code ahead):

i = 1;
while ((i * 10) <= n)
i *= 10;
for (; i != 0; i /= 10)
{
int x = n / i;
*p++ = (char)(x % 10 + '0');
n -= (x * i);
}
assert(n == 0);

• There is no standard version of itoa. As in: how it should behave isn't specified anywhere. – Lundin Feb 6 '14 at 13:34