文章标题 整数与字符串互转

来源:互联网 发布:八百字淘宝导购 编辑:程序博客网 时间:2024/06/05 05:27

先来看两个错误的实现
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 intlong 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;}
原创粉丝点击