字符串转数字

注意进制,注意小数,负数,指数。

小数跟指数比较繁琐。应该对字符串做限制,字符串只是整数字符串。否则,以下几种情况都是会报错:

1. 0x011.011,0b011.011都是错误的。

2. 0100.011实际上是十进制的100.01。

3. 指数表示造成逻辑更多了。

鉴于以上几个情况考虑,为简化,整数字符串转数字。


草草写了几行代码:

typedef enum {
    ErrorNull = -1,
    ErrorString = -2,
    Right = 0,
} ReturnCode;

typedef enum {
    RadixDec = 10,
    RadixHex = 16,
    RadixOct = 8,
    RadixBin = 2,
} Radix;

ReturnCode processNumber(char *string, size_t len, Radix radix, int flag)
{
    if (!string || len == 0)
        return ErrorString;

    int tmp = 0, result = 0;
    switch (radix) {
        case RadixDec:
            for (size_t i = 0; i < len; i++) {
                tmp = string[i] - '0';
                if (tmp < 0 || tmp > 9)
                    return ErrorString;
                
                result = result * radix + tmp;
            }
            break;
        case RadixHex:
            for (size_t i = 0; i < len; i++) {
                if (string[i] <= '9' && string[i] >= '0') {
                    tmp = string[i] - '0';
                }
                else if (string[i] <= 'F' && string[i] >= 'A') {
                    tmp = string[i] - 'A' + 10;
                }
                else if (string[i] <= 'f' && string[i] >= 'a') {
                    tmp = string[i] - 'a' + 10;
                }
                else {
                    return ErrorString;
                }
                
                result = result *radix + tmp;
            }
            break;
        case RadixOct:
            for (size_t i = 0; i < len; i++) {
                tmp = string[i] - '0';
                if (tmp < 0 || tmp > 7)
                    return ErrorString;
                
                result = result *radix + tmp;
            }
            break;
        case RadixBin:
            for (size_t i = 0; i < len; i++) {
                tmp = string[i] - '0';
                if (tmp < 0 || tmp > 1)
                    return ErrorString;
                
                result = result *radix + tmp;
            }
            break;
        default:
            return ErrorString;
    }
    
    //printf("%d, 0x%x, 0%o", result, result, result);
    return Right;
}

ReturnCode stringToNumber(char *string, size_t len)
{
    if (!string || len == 0)
        return ErrorNull;
    
    Radix numberRadix = RadixDec;
    int flag = 1;
    if (string[0] == '-') { //minus number
        flag = -1;
        
        if (string[1] == '0') {
            switch (string[2]) {
                case 'b':
                    numberRadix = RadixBin;
                    break;
                case 'x':
                    numberRadix = RadixHex;
                    break;
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                    numberRadix = RadixOct;
                    return processNumber(string + 2, len - 2, numberRadix, flag);
                    break;
                default:
                    return ErrorString;
            }
            return processNumber(string + 3, len - 3, numberRadix, flag);
        }
        else if (string[1] >= '1' && string[1] <= '9') {
            numberRadix = RadixDec;
            return processNumber(string + 1, len - 1, numberRadix, flag);
        }
        else {
            return ErrorString;
        }
        
    }
    else if (string[0] <= '9' && string[0] >= '0') { // positive number
        
        if (string[0] == '0') {
            switch (string[1]) {
                case 'b':
                    numberRadix = RadixBin;
                    break;
                case 'x':
                    numberRadix = RadixHex;
                    break;
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                    numberRadix = RadixOct;
                    return processNumber(string + 1, len - 1, numberRadix, flag);
                    break;
                default:
                    return ErrorString;
            }
            return processNumber(string + 2, len - 2, numberRadix, flag);
        }
        else {
            numberRadix = RadixDec;
            return processNumber(string, len, numberRadix, flag);
        }
    }
    
    return ErrorString;
}

int main(int argc, const char * argv[]) {
    char string[] = "1111";
    return stringToNumber(string, strlen(string));
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值