题目:
运用printd函数的设计思想编写一个递归版本的itoa函数,即通过递归调用把整数转换成字符串。
自我解答:
3.6节中itoa函数的定义如下:
void itoa(int n, char s[])
{
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++] = '-';
s[i] = '\0';
reverse(s);
}
函数实现的思想是先把数字中的各位按从低到高位的顺序转换成字符,并保存到字符数组s中,然后再做反序操作。
如果用递归方式实现,必须要有一个结束递归的条件,这里结束递归的条件就是在不断递归过程中 n/10小于等于了0. 另外一个需要考虑的问题是,递归跳出之后,转换的字符怎么保存到字符数组s中去,很明显如果定义一个局部变量i,s[i++] = n % 10 + '0',由于i是局部变量,每次进到itoa后i都会被初始化为不确定的值,所以这里的需求是i要维持上次的值不变,正好声明为static类型能满足这个需求;最后需要考虑的问题是怎么把数组s的最后一个元素赋为‘\0’,程序中的实现在给s[i++]赋值之后,每次都对s[i]赋值为'\0'