2009-05-21

itoa一个比较好的实现

代码如下:

void myitoa(int num, char* s, int radix)
{
int newnum;
int i=0;
int j;
char tmp;
newnum = (num<0)?(-num):num;   //此处可能会导致int overflow
while(newnum != 0)
{
tmp = (newnum % radix > 9)?(newnum % radix - 10 + 'A'):(newnum % radix + '0');
s[i++] = tmp;
newnum /= radix;
}
if(num<0)
s[i++] = '-';
s[i] = '\0';
//printf("%s => %d => %d\n", s, strlen(s), i);
// revert s
for(j=0; j<i/2; j++)
{
tmp = s[j];
s[j] = s[i-j-1];
s[i-j-1] = tmp;
}
}

这个函数的局限:
  1. 只能处理到36进制的数(当然不是程序的限制,没有合适的字符来表示更高进制的数了)
  2. s的大小在程序中无处理,更多基于调用者的职责
常见的错误:
  1. 负数未考虑
  2. 数的进制未考虑
  3. 大整数问题(一个典型的int取值范围为:-2147483648-2147483647 (VC6.0)
一个改进的实现为:

int myabs(int a)
{
return (a>0)?a:-a;
}

void revert(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 myitoa(int num, char* s, int radix)
{
int newnum = num;
int i=0;
char tmp;
int t;
while(newnum != 0)
{
t = myabs(newnum % radix);
tmp = (t > 9)?(t - 10 + 'A'):(t + '0');
s[i++] = tmp;
newnum /= radix;
}
if(num<0)
s[i++] = '-';
s[i] = '\0';

// revert s
revert(s);
}
 

没有评论: