首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现atof()函数

实现atof()函数
EN

Code Review用户
提问于 2011-11-28 18:43:26
回答 1查看 4.4K关注 0票数 5

我正在寻找关于编码风格的反馈。我知道这个函数已经存在,我永远不会在经过良好测试的版本上使用我的版本。我只是在练习。

代码语言:javascript
复制
double Clib_atof(char s[])
{
    double val, power, rtn;
    int i, sign;
    for (i = 0; isspace(s[i]); i++);
    sign = (s[i] == '-') ? -1 : 1;
    if (s[i] == '+' || s[i] == '-') ++i;
    for (val = 0.0; isdigit(s[i]); ++i) {
        val = 10.0 * val + (s[i] - '0');
    }
    if (s[i] == '.') {
        ++i;
    }
    for (power = 1.0; isdigit(s[i]); ++i) {
        val = 10.0 * val + (s[i] - '0');
        power *= 10.0;
    }
    rtn = (sign * val / (power));

    // Next work on exponent
    if (s[i] == 'e') {
        int j, esign; 
        int eval = 0;
        fprintf(stdout, "e found\n");
        for (j = i + 1; isspace(s[j]); ++j);
        esign = (s[j] == '-') ? -1 : 1;
        if (s[j] == '+' || s[j] == '-') ++j;
        for (; isdigit(s[j]); ++j) {
            eval = 10 * eval + (s[j] - '0');
        }
        fprintf(stdout, "eval = %d\n", eval);
        int l;
        for (l = 0; l < eval; l++) {
            (esign >= 0) ? (rtn *= 10) : (rtn /= 10);
        }
    }

    // Finally return the solution
    return rtn;
}
EN

回答 1

Code Review用户

回答已采纳

发布于 2011-11-28 19:13:42

代码语言:javascript
复制
double Clib_atof(char s[])
{
    double val, power, rtn;
    int i, sign;
    for (i = 0; isspace(s[i]); i++);

看起来太像;是个意外。我建议使用{/\*empty\*/}来明确说明您是故意的。或者我可以把它写成一个while循环。

代码语言:javascript
复制
    sign = (s[i] == '-') ? -1 : 1;
    if (s[i] == '+' || s[i] == '-') ++i;
    for (val = 0.0; isdigit(s[i]); ++i) {
        val = 10.0 * val + (s[i] - '0');
    }

我不喜欢这里使用for循环。初始化器条件实际上与循环控件没有任何关系。重复循环,直到某些条件变为真为止,感觉就像一个while循环。使用for循环,我会考虑迭代或计数,而不是测试。

代码语言:javascript
复制
    if (s[i] == '.') {
        ++i;
    }
    for (power = 1.0; isdigit(s[i]); ++i) {
        val = 10.0 * val + (s[i] - '0');
        power *= 10.0;
    }

    rtn = (sign * val / (power));

我不会使用像rtnval这样的缩写。它们会使代码更难读。我不认为任何这样的父母都是必要的。

代码语言:javascript
复制
    // Next work on exponent
    if (s[i] == 'e') {
        int j, esign; 
        int eval = 0;

我看着这个,思考评估,但我不认为这是你的意思。

代码语言:javascript
复制
        fprintf(stdout, "e found\n");
        for (j = i + 1; isspace(s[j]); ++j);

你为什么要在这里留出空间?为什么是j?你为什么不和i呆在一起?

代码语言:javascript
复制
        esign = (s[j] == '-') ? -1 : 1;
        if (s[j] == '+' || s[j] == '-') ++j;
        for (; isdigit(s[j]); ++j) {
            eval = 10 * eval + (s[j] - '0');
        }

我注意到,这与前面的代码块几乎相同。考虑将公共位提取到函数中:

代码语言:javascript
复制
        fprintf(stdout, "eval = %d\n", eval);
        int l;
        for (l = 0; l < eval; l++) {
            (esign >= 0) ? (rtn *= 10) : (rtn /= 10);
        }

我怀疑使用pow()函数会更有成效。

代码语言:javascript
复制
    }

    // Finally return the solution
    return rtn;
}
票数 6
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/6370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档