模拟实现C库的atoi和itoa——题集(二十三)

来源:互联网 发布:2015年淘宝总交易额 编辑:程序博客网 时间:2024/06/14 10:58

模拟实现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->aelsetmp.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为空

      注:要想的到以下结果,代码去注释即可。

 

       分享如上,如有错误,望斧正!愿大家学得开心,共同进步!
原创粉丝点击