{
int nRet = 0;
if(data)
{
char* p = data;
int n = 1;
while(*p)
{
if((*p > '9') || (*p < '0') )
{
return 0;
}
++p;
}
--p;
while(p != data)
{
nRet += (*p - '0') * n;
n *= 10;
--p;
}
nRet += (*p - '0') * n;
}
return nRet;
}
{
int size = 1;
static char * Ret = 0;
int tem = num;
while(tem/10)
{
size++;
tem /= 10;
}
if(Ret)
{
free(Ret);
}
Ret = (char*)malloc(sizeof(char) * (size + 1));
Ret[size] = '/0';
tem = num;
while(tem/10)
{
Ret[--size] = (char)('0' + (tem%10));
tem /= 10;
}
Ret[0] = (char)('0' + tem);
return Ret;
}
const int min_integer = -2147483648;
int myatoi( char* szData)
{
int nRet = 0;
int nFlag = 1;
int nLen = 0;
if(szData)
{
char* p = szData;
int nMul = 1;
int nDif = 0;
char* q = szData;
if(*p == '-')
{
nFlag = -1;
++p;
++q;
}
while(*p)
{
if((*p > '9') || (*p < '0') )
{
break;
}
++p;
++nLen;
}
if(nLen > 0)
{
--p;
}
while(p - q >= 0)
{
nDif = (*p - '0') * nMul;
--p;
nMul *= 10;
if(max_integer - nDif < nRet)
{
nRet = max_integer;
p = q;
}
else
{
nRet += nDif;
}
}
}
if(nRet != max_integer)
{
return nFlag * nRet;
}else
{
return (nFlag == -1) ? min_integer : max_integer;
}
}
关于第二个函数,野指针的问题想到了,但是看到inet_ntoa就是那么处理的,所以我也效仿了一下,不过还是改过来好:
char* myitoa(int num)
{
int nSize = 1;
int nFlag = 0;
char * Ret = 0;
int tem = num;
if(num < 0)
{
nFlag = 1;
tem = -num;
}else
{
tem = num;
}
while(tem/10)
{
nSize++;
tem /= 10;
}
if(num < 0)
{
nSize++;
}
Ret = (char*)malloc(sizeof(char) * (nSize + 1));
memset(Ret, 0, nSize + 1);
Ret[nSize] = '/0';
if(num < 0)
{
tem = -num;
}else
{
tem = num;
}
while(tem/10)
{
--nSize;
Ret[nSize] = (char)('0' + (tem%10));
tem /= 10;
}
Ret[--nSize] = (char)('0' + tem);
if(num < 0)
{
Ret[0] = '-';
}
return Ret;
}
在第一个版本的函数里 printf("%s,%s", myitoa(123)), myitoa(234));会得到123,123
而第二个版本的函数里会得到正确的结果123,234
可是有一个问题还是不明白:在向printf函数传递参数时,myitoa(234)会首先被调用,然后是myitoa(123),根据程序的步骤,调用 myitoa(123)的时候,以前调用myitoa(234)申请的空间被free掉了,因此myitoa(234)返回的指针这个时候就指向了无效的 地址,当然myitoa(123)指向新malloc到的内存地址,可是为什么myitoa(234)余留下的野指针却指向123存放的地址啊,也就是
printf("%s,%s", myitoa(123), myitoa(234))的第二个输出应该不可遇见啊,为什么确是相同的?