模拟实现C库的atoi和itoa——题集(二十三)
今天主要分享一下模拟实现C库的atoi和itoa的代码实现和运行示例.
C库的atoi的定义如下:
int atoi (const char * str);
模拟实现C库的atoi的源代码和运行示例。
源代码如下:
#include<iostream>
using namespace std;
int AtoI (const char * str){
int num=0;
int flag=1;标志是正数还是负数
if(*str=='+' || *str=='-')
{
if(*str=='-')
flag=-1;
*str++;
}
while(*str){
if(*str>'9' || *str<'0')break;
num= num*10+(*str++-'0');
}
return num*flag;
}
int main(){
cout<<"模拟实现atoi "<<endl<<endl;
cout<<"AtoI(\"123\"): "<<AtoI("123")<<endl;
cout<<"AtoI(\"-123\"): "<<AtoI("-123")<<endl;
cout<<"AtoI(\"0.123\"): "<<AtoI("0.123")<<endl;
cout<<"AtoI(\"12x3\"): "<<AtoI("12x3")<<endl;
cout<<"AtoI(\"12-3\"): "<<AtoI("12-3")<<endl;
cout<<"AtoI(\"x12e3\"): "<<AtoI("x12e3")<<endl;
cout<<"AtoI(\"-\"): "<<AtoI("-")<<endl<<endl;
system("pause");
return 0;
}
运行结果:
C库的itoa的定义如下:
char * itoa ( int value, char * str, int base );
虽然规定数字基用于表示值作为字符串,在2和36之间,10表示十进制基数,16十六进制,8八进制和2二进制。但是实验的结果证明这仅仅是规定:
发现当base(数字基)等于1时,itoa会崩溃,我猜想是因为代码无限循环导致的。截图如下:
同时base(数字基)大于32时,依旧能得到相应进制而转化的字符串,只是传化出来的字符不可见而已,截图如下:
返回值与str值相同。
模拟实现C库的itoa的源代码和运行示例。源代码如下:
#include<iostream>
using namespace std;
#include<stack>
char * ItoA ( int value, char * str, int base ){//int会把浮点转化为整形,不用考虑小数
char* dst=str;
int val=value;
if(value==0){//值为0,直接转化为0,不用继续
*dst++='0';
*dst='\0';
return str;
}
//if(base>32 || base<2){//修正//对数字基做检查,严格规定在[2,32],否则str为空
// *dst='\0';
// return str;
//}
int num=1;
stack<char> tmp;//得到逆置的字符串——借助栈得到正序的
while(num){
num=val/base;
int rem=val%base;
if(rem<10)
tmp.push(rem+'0');//>10+39->a
else
tmp.push(rem-10+'a');//>10+39->a//跳过大写字母
val=num;
}
while(!tmp.empty()){
*dst++=tmp.top();
tmp.pop();
}
*dst='\0';
return str;
}
int main(){
cout<<"模拟实现itoa"<<endl<<endl;
cout<<"ItoA(0,dst,2): "<<ItoA(0,dst,2)<<endl;
cout<<"ItoA(-0,dst,2): "<<ItoA(-0,dst,2)<<endl;
cout<<"ItoA(127,dst,10): "<<ItoA(127,dst,10)<<endl;
cout<<"ItoA(10,dst,2): "<<ItoA(10,dst,2)<<endl;
cout<<"ItoA(16,dst,8): "<<ItoA(16,dst,8)<<endl;
cout<<"ItoA(48,dst,2): "<<ItoA(48,dst,2)<<endl;
cout<<"ItoA(32,dst,48): "<<ItoA(32,dst,48)<<endl;
cout<<"ItoA(99,dst,53): "<<ItoA(32,dst,53)<<endl;
cout<<"ItoA(99,dst,66): "<<ItoA(99,dst,66)<<endl<<endl;
//cout<<"ItoA(22,dst,1): "<<ItoA(22,dst,1)<<endl<<endl;
system("pause");
return 0;
}
运行结果:
完全模拟c库中的itoa得到的运行结果:
修正c库中的itoa得到的运行结果:(数字基做检查,严格规定在[2,32],否则str为空)
注:要想的到以下结果,代码去注释即可。
分享如上,如有错误,望斧正!愿大家学得开心,共同进步!