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;
}