由十进制整形转化为字符串想到的

  本来人就笨,专业也不是计算机,写代码靠自学,调bug靠运气,可是十进制转化为字符串想必大家用C语言实现那是相当的容易!假如面试官叫你现场写一个由十进制整形转化为字符串的C语言程序,估计你会大呼简单到死!本人愚昧,给出一个10分钟版本:

char* int2string(int iValue)
{
  char* pData = new char[20];
  char* pBuffer = new char[20];
  int iPos = 0;
  int iStart = 0;
  if(iValue < 0)
  {
    pData[0] = '-';
    iStart = 1;
    iValue = -iValue;
  }
  int iSec = 0;
  while( iValue > 0 )
  {
    iSec = iValue/10;
    int iFir = iValue - iSec*10;
    pBuffer[iPos++] = iFir + '0';
    iValue = iSec;
  }
  for(int i = 0; i < iPos; i++)
  {
    pData[i + iStart] = pBuffer[iPos - 1 - i];
  }
  pData[iPos + iStart] = '\0';
  delete pBuffer;
  return pData;
}

  

  调用时候使用:

  char* pC = int2string(-200222);
  std::cout<<pC;
  delete pC;

虽然写的也不怎么快,但是这个函数还是很简单的,测试几个数据也没有发现什么问题,可是函数这样写确实有个问题:返回值的指针是由内部开辟出来的,所以调用者需要在外面delete返回值,很容易被忘掉。

这时候该怎么办呢?

一个想法就是把char的指针当做变量传入函数,这时候函数就写成如下的形式了:

void int2string(char* pData,  int iValue)

pData的指针在调用函数之外分配空间,可是你万一分配的空间不够怎么办呢,又有一个解决办法就是再加上一个参数,表征pData的数据长度,这时候函数就写成如下的形式了:

void int2string(char* pData, int iLength, int iValue)

可是万一函数在某种情况之下调用失败了怎么办?

你可以想到加上一个bool返回值,为true成功,为false失败:

bool int2string(char* pData, int iLength, int iValue)

可是万一转换的一般过程中就失败了,你不该表示一下一些多余的信息吗?

于是你可以认为返回值代表了转换成功的字符数,于是返回值变成int类型:

int int2string(char* pData, int iLength, int iValue)

上面的这种类型的函数给出一个实现(可能会有bug):

int int2string(char* pData, int iLength, const int iValue)
{
  int iValue_copy = iValue;
  assert(pData);
  if(iLength <= 1)
    return 0;
  char* pBuffer = new char[iLength - 1];
  int ret = 0;
  int pos = 0;
  int iStart = 0;
  if(iValue_copy < 0)
  {
    pData[0] = '-';
    iStart = 1;
    ret++;
    if(iLength - pos == 1)
    {
      pData[1] = '\0';
      delete pBuffer;
      return ret;
    }
    iValue_copy = -iValue_copy;
  }
  int iSec = 0;
             
  while( iSec = iValue_copy/10, iValue_copy > 0 )
  {
    int iFir = iValue_copy - 10*iSec;
    iValue_copy = iSec;
    pBuffer[pos++] = iFir + '0';
    ret++;
    if(iLength - pos - iStart <= 1)
    {
      pData[iLength - 1] = '\0';
      for(int i = iStart; i < iLength - 1; i++)
        pData[i] = pBuffer[iLength - 2 - i];
      delete pBuffer;
      return ret;
    }
  }
  pData[pos] = '\0';
  for(int i = iStart; i < ret - 1; i++)
    pData[i] = pBuffer[ret - 2 - i];
  delete pBuffer;
  return ret;
}

  

可是,有人就说我就是不知道要给这个函数传入一个多大的length怎么办,虽然返回了一个int类型代表了转换成功的位数,于是你该想到如果转换不成功就返回一个最少需要的length,转换成功就干脆返回0的了,于是函数变成下面这样了(可能会有bug):

int int2string(char* pData, int iLength, int iValue)
{
  assert(pData);
  bool bOK = true;
  if(iLength <= 1)
    bOK = false;
  char* pBuffer = new char[iLength - 1];
  int pos = 0;
  int iStart = 0;
  int ret = 0;
  if(iValue < 0)
  {
    if(bOK)
      pData[0] = '-';
    iStart = 1;
    ret++;
    if(iLength - pos == 1)
    {
      if(bOK)
        pData[1] = '\0';
      bOK = false;
      if(pBuffer)
      {
        delete pBuffer;
        pBuffer = NULL;
      }
    }
    iValue = -iValue;
  }
  int iSec = 0;
           
  while( iSec = iValue/10, iValue > 0 )
  {
    int iFir = iValue - 10*iSec;
    iValue = iSec;
    if(bOK)
      pBuffer[pos++] = iFir + '0';
    ret++;
    if(iLength - pos - iStart <= 1)
    {
      if(bOK)
        pData[iLength - 1] = '\0';
      if(bOK)
      {
        for(int i = iStart; i < iLength - 1; i++)
        {
          pData[i] = pBuffer[iLength - 2 - i];
        }
      }
      if(pBuffer)
      {
        delete pBuffer;
        pBuffer = NULL;
      }
      bOK = false;
    }
  }
  if(bOK)
    pData[pos] = '\0';
  if(bOK)
  {
    for(int i = iStart; i < ret - 1; i++)
    {
      pData[i] = pBuffer[ret - 2 - i];
    }
  }
  if(pBuffer)
  {
    delete pBuffer;
    pBuffer = NULL;
  }
  if(!bOK)
    return ++ret;
  else
    return 0;
}

  

调用的第一次可以随便传递一个length,如果返回值是0说明转换成功,如果返回值是一个大于零的值,说明转换失败,并且返回值是至少需要的length,返回的指针内容可能是乱的,必须在返回值是0的时候,pData的数据才是正确的!

转载于:https://www.cnblogs.com/dawnight/archive/2013/04/19/3031386.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值