题目描述
需要编写一个函数,将字符串转换为double型实数。函数原型为:
double strToDouble( char str[] );
其中:参数str[]是需要转换的字符串,返回值表示字符串str[]转换为实数之后的结果。
转换规则是:将字符串str[]中的全部数字字符转换为实数并返回。
如果str[]不包含任何数字字符,则返回0;如果str[]是空串,则返回0。
如果str[0]是“-”则表示转换后的实数是负数,否则是非负数。
示例:strToInt(“123ab.4”)=123.4; strToInt(“-a.123-4”)=-0.1234。
输入
输入是若干行字符串,它们都包含不超过10个的字符,而且包含的实数不会超出double类型的表示范围。
输出
输出为若干行实数(保留6位有效数字,且不输出无意义的0),每一行输出与上述输入一一对应。
输入输出样例
输入样例1 <-复制
123ab.4
-a.123-4
+234.33
输出样例1
123.4
-0.1234
234.33
AC代码
#include<stdio.h>
#include<math.h>
#include<string.h>
char str[20], a[30];
// 字符串转换为double型实数
double strToDouble(char str[])
{
int i, j, flag = 0, decimalPlace = 0;
double number, sum = 0;
// 遍历字符串
for (i = 0, j = 0; str[i] != '\0'; i++)
{
// 处理数字和负号
if ((i == 0 && str[i] == '-') || (str[i] >= '0' && str[i] <= '9'))
{
a[j] = str[i];
j++;
}
// 处理小数点
if (str[i] == '.' && flag == 0)
{
if (j == 0 || a[j - 1] == '-')
{
a[j] = '0';
a[j + 1] = '.';
decimalPlace = j + 1;
j += 2;
}
else
{
a[j] = '.';
decimalPlace = j;
j++;
}
flag++;
}
}
// 如果没有小数点,则小数点位置为j
if (decimalPlace == 0)
decimalPlace = j;
// 将字符转换为数字
for (i = 0; i < j; i++)
{
if (a[i] >= '0' && a[i] <= '9')
a[i] -= '0';
}
// 计算实数
for (i = 0; i < j; i++)
{
if (a[i] == '-')
continue;
if (i < decimalPlace)
{
number = pow(10, decimalPlace - i - 1) * a[i];
sum += number;
}
else if (i > decimalPlace)
{
number = pow(10, decimalPlace - i) * a[i];
sum += number;
}
}
// 如果字符串为空或只有负号,则返回0
if (j == 0)
return 0;
// 如果第一个字符为负号,则将结果乘以-1
if (a[0] == '-')
sum *= -1;
return sum;
}
int main()
{
double result;
while (gets(str))
{
// 调用函数将字符串转换为实数
result = strToDouble(str);
// 输出结果,保留6位有效数字
printf("%.6g\n", result);
}
return 0;
}
该代码实现了将字符串转换为double型实数的功能。
主要的逻辑在函数 strToDouble()
中。
首先遍历字符串,处理数字和负号,并将它们保存到数组 a[]
中。同时处理小数点,并记录小数点的位置。然后将字符转换为数字。
接下来根据小数点的位置计算实数的值。最后根据字符串的特殊情况返回结果。
(by 归忆)