[英]Implement the following function which converts a string representation of a floating-point number into a double:
实现以下函数,将浮点数的字符串表示形式转换为双精度数:
双 strToDouble(char[] str)
您的实现应该能够正确处理字符串,例如:
- “123456”
- “-123.456”
- “123.456e13”
- “123.456e-13”
任何格式不正确的输入字符串都应导致返回值 0.0。
提示和建议:
- 使用上面的函数 strToInt 作为起点。
- 在第一个循环后使用 if 语句来检查小数点、e(用于科学记数法指数)和负号等内容。
- 使用单独的循环处理可能的小数点后的内容。
- 使用另一个循环来处理 e 之后可能的指数值。
我在调用函数 strToDouble 后如何回答
1)应该是正确的输出是这样的:
123456
-123.456000
1234560000000000.000000
0.000000
2)为什么我们需要放[i + 2]和[i+1]?我是随机放的,但我没有解释。
——
double strToDouble(const char str[]) {
int i = 0, k = 10;
double result = 0, doubleValue, expValue = 0, resultDecimal = 0;
double exp = 1;
if (str[0] == '-')
{
i++;
}
while (str[i] >= '0' && str[i] <= '9')
{
doubleValue = str[i] - '0';
result = result * 10 + doubleValue;
i++;
}
if (str[i] == '.')
{
while (str[i + 1] >= '0' && str[i + 1] <= '9')
{
doubleValue = (str[i + 1] - '0');
resultDecimal = resultDecimal + doubleValue / k;
k *= 10;
i++;
}
}
if (str[i + 1] == 'e')
{
if (str[i + 2] == '-')
{
while (str[i + 3] >= '0' && str[i + 3] <= '9')
{
doubleValue = str[i + 3] - '0';
expValue = expValue * 10 + doubleValue;
i++;
}
for (k = 0; k < expValue; k++)
{
exp /= 10;
}
}
else
{
while (str[i + 2] >= '0' && str[i + 2] <= '9')
{
doubleValue = str[i + 2] - '0';
expValue = expValue * 10 + doubleValue;
i++;
}
for (k = 0; k < expValue; k++)
{
exp *= 10;
}
}
}
result = (result + resultDecimal) * exp;
为什么我们需要放
[i + 2]
和[i+1]
?我是随机放的,但我没有解释。
这些随机偏移会破坏您的代码。 它适用于给定的示例,但如果您没有指定句点而是指数,例如“1e3”,它会中断,因为即使没有时期:
if (str[i] == '.') {
// parse mantissa, using i + 1 as index
}
if (str[i + 1] == 'e') // i + 1 may be one beyond the character you
// should be looking at.
只有当你真的找到一个时,你才应该在句号后推进当前字符:
if (str[i] == '.') {
i++; // step over period
// parse mantissa, using i as index
}
if (str[i] == 'e') {
i++; // step over 'e'
// parse exponent, using i as index
}
跨过符号+
(您似乎根本没有处理)和-
(您检测到,但不在结果中考虑)也是如此。
换句话说:您当前正在检查的字符应始终位于索引i
。 你可以向前看,但只能在上下文中。 当您向前看时,您还应该确保您看到的字符不在可能的空终止符之后。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.