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

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

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

 

       分享如上,如有错误,望斧正!愿大家学得开心,共同进步!
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值