atoi 和 itoa是面试笔试经常要考到的题目,下面两份代码是用C语言实现的atoi和itoa:
1, atoi
原型: int atoi(const char *nptr);
函数说明: 参数nptr字符串,如果第一个非空格字符不存在或者不是数字也不是正负号则返回零,否则开始做类型转换,之后检测到非数字(包括结束符 \0) 字符时停止转换,返回整型数。
#include <stdio.h>
#include <assert.h>
static int atoi(const char* str)
{
int result = 0;
int sign = 1;
assert(str != NULL);
// proc whitespace characters
while (*str==' ' || *str=='\t' || *str=='\n')
++str;
// proc sign character
if (*str=='-')
{
sign = -1;
++str;
}
else if (*str=='+')
{
//sign = 1;
++str;
}
// proc numbers
while (*str>='0' && *str<='9')
{
//result = result*10 + *str++ - '0';
result = result*10 + *str - '0';
++str;
}
// return result
return sign*result;
}
2. itoa
char *itoa( int value, char *string,int radix);
原型说明:
value:欲转换的数据。
string:目标字符串的地址。
radix:转换后的进制数,可以是10进制、16进制等
char *itoa(int val, char *buf, unsigned radix)
{
char *p;
char *firstdig;
char temp;
unsigned digval;
p = buf;
if(val <0)
{
*p++ = '-';
val = (unsigned long)(-(long)val);
}
firstdig = p;
do{
digval = (unsigned)(val % radix);
val /= radix;
if (digval > 9)
*p++ = (char)(digval - 10 + '0');
else
*p++ = (char)(digval + '0');
}while(val > 0);
*p-- = '\0 ';
do{
temp = *p;
*p = *firstdig;
*firstdig = temp;
--p;
++firstdig;
}while(firstdig < p);
return buf;
}
方法2(在VC++6.0中编译通过)
#include "stdafx.h"
#include <stdio.h>
char *itoa(int num, char *str, int radix)
{
//1)将数字转换为字符串
//保存原str
char *ptr = str;
int i,j;
while(num)
{
*ptr++ = (char)(num % radix + '0');
num /= radix;
if(num < radix)
{
*ptr++ = (char)(num + '0');
//勿忘在字符串结尾添加'\0'
*ptr = '\0';
break;
}
}//end while
//2)将字符串逆序
//j值为数组最后一个下标
j = ptr-str-1;
for(i=0; i<(ptr-str)/2; ++i)
{
char temp = str[i];
str[i] = str[j];
str[j--] = temp;
}
//3)返回值
return str;
}
int main(int argc, char* argv[])
{
char res[9] ;
itoa(12345678,res,10);
printf("== %s \n",res);
return 0;
}