自己实现字符串转数字

本文介绍了如何将字符串转换为整数和浮点数的过程,并通过C语言实现两种转换方法。对于整数转换,采用assert确保输入字符串的有效性;对于浮点数转换,则提供了两个版本的实现,分别针对简单浮点数和更精确的小数部分处理。
摘要由CSDN通过智能技术生成

A. atoi,字符串转整数

使用assert强制规定字符串一定是合法的,剩下的就是正负号了。

#include <stdio.h>
#include <assert.h>

int atoi(const char* str) {
    if (str == NULL)
        return 0;

    int num = 0, i = 0;
    bool neg = false;
    if (str[0] == '-') {
        neg = true;
        ++i;
    }

    while (str[i] != '\0') {
        assert (str[i] >= '0' && str[i] <= '9');
        num *= 10;
        num += int(str[i]-'0');
        ++i;
    }

    if (neg)
        return -num;
    return num;
}


int main() {
    printf("%d\n", atoi("233"));
    printf("%d\n", atoi("980"));
    printf("%d\n", atoi("066"));
    printf("%d\n", atoi("-123"));

    return 0;
}

B. stof,字符串转float

这里只实现了简单的浮点数形式,没有实现像1e-10这样子的转化。
一开始输出的时候,以为是精度的问题,然后发现,转化的精度方面不会差太多,主要是float表示不了那么精确的浮点数,所以导致结果输出与原始数字有点不同:
233.0000000000, real=233.0000000000

3.1415927410, real=3.1415927410

123.4567871094, real=123.4567871094

-123.4567871094, real=-123.4567871094

#include <stdio.h>
#include <assert.h>


/*
// version 1
float stof(const char* str) {
    float num = 0;
    int i = 0;
    for (i = 0; str[i] != '\0' && str[i] != '.'; ++i) {
        assert(str[i] >= '0' && str[i] <= '9');
        num *= 10;
        num += int(str[i] - '0');
    }

    if (str[i] == '\0')
        return num;

    float digit = 0.0, div = 1.0;
    for (++i; str[i] != '\0' && str[i] != '.'; ++i) {
        digit *= 10.0f;
        digit += int(str[i] - '0');
        div *= 10.0f;
    }

    return digit/div + num;
}*/

// version 2: maybe more precise
float stof(const char* str) {
    if (str == NULL)
        return 0.0f;

    float num = 0;
    int i = 0;
    bool neg = false;
    if (str[0] == '-') {
        neg = true;
        ++i;
    }

    while(str[i] != '\0' && str[i] != '.') {
        assert(str[i] >= '0' && str[i] <= '9');
        num *= 10;
        num += int(str[i] - '0');
        ++i;
    }

    if (str[i] == '\0')
        return (neg) ? -num : num;

    int start = i + 1, end = start;
    while (str[end] != '\0' && str[end] != '.')
        ++end;

    float digit = 0.0f;
    for (int j = end-1; j >= start; --j) {
        assert(str[j] >= '0' && str[j] <= '9');
        digit += int(str[j] - '0');
        digit *= 0.1f;
    }

    return (neg) ? -(digit + num) : (digit + num);
}

int main() {
    float a = 233.0f, b = 3.1415928f, c = 123.456789f;
    printf("%.10f,\t real=%.10f\n\n", stof("233"), a);
    printf("%.10f,\t real=%.10f\n\n", stof("3.1415928"), b);
    printf("%.10f,\t real=%.10f\n\n", stof("123.456789"), c);
    printf("%.10f,\t real=%.10f\n\n", stof("-123.456789"), -c);

    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值