本来人就笨,专业也不是计算机,写代码靠自学,调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的数据才是正确的!