Реализация это (функция)


Я ищу обратную связь о стиле кодирования. Я знаю, что эта функция уже существует, и я бы никогда не использовать мой вариант более хорошо протестированных один. Я просто практикуюсь.

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;
}


Комментарии
1 ответ

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');
}

Я не люблю использовать цикл for здесь. Состояние инициализатор на самом деле не имеют ничего общего с контролем петли. Повторять цикл, пока определенное условие не станет истинным ощущениям во время цикла. С для петли я думаю о переборе или не считая тестирования.

    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;
}

6
ответ дан 28 ноября 2011 в 07:11 Источник Поделиться