先来看两个错误的实现
1.
//整数转换成字符串
void IntToString(char* str,int n)
{
int i = 0;
if( n < 0 )
{
n = -n;//这里错误,若n=-2147483648,那么n=-n后,你还是为-2147483648
str[i++] = '-';//如果是负数字符串第一个字符为'-'
}
while( n/10 != 0 )//将整数反序放入字符串中
{
str[i++] = n%10 + '0';
n /= 10;
}
str[i++] = n + '0';
str[i] = '\0';//别忘了字符串结束标记
i--;//i 指向最后一个字符的下标
int j = 0,sign=0;
if(str[0] == '-' ) {j=1;sign=1;}
for ( ; j <= i/2 ; j++ )//将字符串反序
{
char temp = str[j];
str[j] = str[i-j+sign];
str[i-j+sign] = temp;
}
}
- 2.
//字符串转换整数
int StringToInt(char* str)//仅仅考虑到正常的输入,且没有考虑超出int的范围。
{
if (str == NULL){return 0;}
int result = 0;
bool b = true;
if( *str == '-' || *str == '+' )
{
if( *str = '-' )
b = false;
str++;
}
while( *str != '\0' )
{
if( *str < '0' || *str > '9' )
{return -1;}
else
{
result = 10*result + (*str - '0');
}
str++;
}
return (b ? result : -result);
}
3.
int main ()
{
int num = 12345;
char a[10];
IntToString(a,num);
std::cout <<a;
std::cout <<StringToInt(a);
return 0;
}
下面实现atoi()
int my_atoi(const char* str){
int sign = 1;
int ret = 0;
int i = 0;
int n = strlen(str);
int max = ~(1 << (8 * sizeof(int) - 1));//最大的int
assert(str != NULL);
while (str[i] == ' '&& i < n){++i;}
if (str[i] == '+'){ ++i; }
else if (str[i] == '-'){ ++i; sign = -1; }
for (; i<n; ++i){
if (str[i] < '0' || str[i] > '9'){ break; }
if (ret > max / 10 || ret == max / 10 && ((str[i] - '0')>max % 10)){
return sign == -1 ? (-1 - max) : max;
}
ret = ret * 10 + str[i] - '0';
}
return ret*sign;
}
//把字符串按基数base转化为long int
long int my_strtol(const char* str, char** endptr, int base){
//static char table[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
long ret = 0;
int sign = 1;
int n = strlen(str);
int i = 0;
long int max = ~(1 << (8 * sizeof(long int) - 1));
assert(base == 0 || (base >= 2 && base <= 36));
while (str[i] == ' ' && i < n){
++i;
}
if (str[i] == '+'){ ++i; }
else if (str[i] == '-'){ ++i; sign = -1;}
if (!(i < n)){
if(NULL!=endptr)*endptr = (char*)&str[i];
return sign*ret;
}
if (base == 0 || base == 16){
if (str[i] == '0' && (str[i + 1] == 'x' || str[i + 1] == 'X')){ i += 2; base = 16; }//仅仅考虑了正确情况下的16进制字符串
else if (str[i] == '0'){ i += 1; base = 8; }//注意这里两处的base赋值
}
for (; i < n; ++i){
if (base <= 10){
if (str[i] < '0' || str[i] > '0' + base){
break;
}
if (ret > max / 10 || ret == max / 10 && ((str[i] - '0')>max % 10)){
return sign == -1 ? (-1 - max) : max;
}
ret = ret * base + str[i] - '0';
}
else{
if ((str[i] >='0'&&str[i] <='9')
|| (str[i] >= 'A' &&str[i]<'A'+base-10)
|| (str[i] >= 'a' &&str[i]<'a' + base - 10)
){
if (ret > max / 10 || ret == max / 10 && ((str[i] - '0')>max % 10)){
return sign == -1 ? (-1 - max) : max;
}
if (str[i] >= 'a'){ ret = ret * base + str[i] - 'a' + 10; }
else if (str[i] >= 'A'){ ret = ret * base + str[i] - 'A' + 10; }
else{ ret = ret * base + str[i] - '0'; }
}
else{
break;
}
}
}
if (NULL != endptr)*endptr = (char*)&str[i];
return sign*ret;
}