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