模拟实现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