atoi和itoa

atoi

atoi的全称是convert ASCII string to integer

原型: int atoi(const char *nptr);

const char* nptr ; 说明nptr是常量的指针,哪个常量呢,是const char 这个常量,说明这个指针nptr所指向地址的内容是不能改变的,在形参里都是常量指针;指针常量在形参里是没有意义的,指针常量的意思是说这个指针指向的地址不能改变,而我们都知道形参是一个局部变量。这样的限定对函数外部没有任何意义。指针常量的声明方式是char * const nptr;

函数说明: 参数nptr字符串,如果第一个非空格字符不存在或者不是数字也不是正负号则返回零,否则开始做类型转换,之后检测到非数字(包括结束符 \0) 字符时停止转换,返回整型数。

实现代码如下:这是我写的,源代码可以自己网上查找

int myAtoi(const char *str)
{
	int sign=1;
	int value=0;
	bool start=false;
	bool end=false;
	while(*str++==' ') {}
	str--;
	if(*str=='+')
	{
		sign=1;str++;
	}
	else if(*str=='-')
	{
		sign=-1;str++;
	}
	while(*str<'9'&&*str>'0')
	{
		value=value*10+(*str-'0');
		str++;
	}
	return sign==-1?-value:value;
}


下面还有个功能加强版的atoi:

比如对于字符串“a+j-313+kk233”,源代码是返回0的,我想要返回-313,也就是说返回字符串中的一个合法的能够转化为整数的数。

代码如下:

int myAtoi2(const char *str)
{
	int sign=0;
	int value=0;
	bool start=false;
	bool end=false;
	while(true)
	{		
		if(*str==0)
			end=true;
		if(!start){
			if(*str=='+'||*str=='-')//找到一个符号,而且后面是数字,那么我们就从此开始
			{
				if(*(str+1)<'9'&&*(str+1)>'0')
				{
					*str=='+'?sign=1:sign=-1;
					start=true;
				}
			}
			if(*str<'9'&&*str>'0')
			{
				start=true;
				value=*str-'0';
				sign=1;
			}
			str++;continue;
		}
		if(start)
		{
			if(*str<'9'&&*str>'0')
			{
				value=value*10+(*str-'0');
				str++ ;continue;
			}
			else
				end=true;

		}
		if(end)
		{
			sign==1?value:value=-value;
			return value;
		}
	}
}


itoa

描述:把数字转换成字符串的函数itoa的实现

char * myitoa(int n,char *result,int radix)
{//int 的范围是-2^31...2^31-1,也即-2 147 483 648...2 147 483 647,只要12个的char完全可以表示,最后一个是结束符'\0'
	if(n==0)
	{
		result[0]='0';
		result[1]=0;
		return result;
	}
	char  string[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	bool neg=false;
	int count=0;
	if(n<0)
	{neg=true;*result++='-';count++;}
	if(n<0)
		n=-n;
	while(n>0)
	{
		*result++=string[n%radix];
		n=n/radix;
		count++;
	}
	*result=0;
	result-=count;
	if(!neg)//count是char的个数
		for(int i=0;i<count/2;i++)
		{
			char temp=result[i];
			result[i]=result[count-1-i];
			result[count-1-i]=temp;
		}
	else
		for(int i=1;i<count/2+1;i++)
		{
			char temp=result[i];
			result[i]=result[count-i];
			result[count-i]=temp;
		}
		return result;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zlingh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值