解题思路
我们观察最初的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);
}
上述n = -n
的操作无法对最大负数起作用,因为c语言中数以补码表示,比如表示范围为-128 ~ 127
,这个时候-128
无法被n = -n
成功操作,这样导致了上述代码无法处理最大负数的问题。
我们可以通过避免使用 n = - n
来完成上述操作。
void itoa(int n, char s[])
{
int sign = n;
int i = 0;
do {
s[i++] = abs(n % 10) + '0'; //避免负数
} while((n / 10) > 0);
if(sign < 0) s[i++] = '-';
s[i] = '\0'
reverse(s);
}