常用代码收集

收集一些平时好用的代码,可以在紧急时后直接拷贝
(1):字符串转换成整数:atoi
 int myatoi( char* data)
 {
    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;
}
(2):整数转换成字符串
char*  myitoa(int num)
{
  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;
}
2007-5-18
多谢涛涛啊,厉害!
我改了一下,你再看看
const  int max_integer =  2147483647;
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))的第二个输出应该不可遇见啊,为什么确是相同的?

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值