我正在寻找关于编码风格的反馈。我知道这个函数已经存在,我永远不会在经过良好测试的版本上使用我的版本。我只是在练习。
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;
}发布于 2011-11-28 19:13:42
double Clib_atof(char s[])
{
double val, power, rtn;
int i, sign;
for (i = 0; isspace(s[i]); i++);看起来太像;是个意外。我建议使用{/\*empty\*/}来明确说明您是故意的。或者我可以把它写成一个while循环。
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循环,我会考虑迭代或计数,而不是测试。
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));我不会使用像rtn和val这样的缩写。它们会使代码更难读。我不认为任何这样的父母都是必要的。
// 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);你为什么要在这里留出空间?为什么是j?你为什么不和i呆在一起?
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);
}我怀疑使用pow()函数会更有成效。
}
// Finally return the solution
return rtn;
}https://codereview.stackexchange.com/questions/6370
复制相似问题