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), andstrindex
andgetop
(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.
1 Answer 1
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);
-
\$\begingroup\$ There is no standard version of itoa. As in: how it should behave isn't specified anywhere. \$\endgroup\$Lundin– Lundin2014年02月06日 13:34:35 +00:00Commented Feb 6, 2014 at 13:34
hidden
function. It's hard to tell what the function does. \$\endgroup\$