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

先来看两个错误的实现
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;
    }
}
  1. 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值