【发布时间】:2020-12-26 18:11:31
【问题描述】:
using namespace std;
float str_to_float(char x[]) {
int j;
float val1 = x[0] - '0';
float val2=0,factor=1;
for (int i = 1; x[i] != '.'; i++) {
val1 = (val1 * 10) + (x[i] - '0');
j = i;
}
for (int k = j + 2; k != '\0'; k++) {
**val2 = val2 + (x[k] - '0')*factor;**
factor /= 10;
}
return val1+val2;
}
int main() {
char x[1000];
cin.getline(x, 1000);
cout<<str_to_float(x);
return 0;
}
此函数应返回包含浮点数的字符串的浮点值。 调试“读取访问冲突”时,粗体行(在第二个 for 循环中)出现错误
【问题讨论】:
-
k != '\0'您并不想将数组中的索引与数组中的字符值进行比较。 -
当
x[1]是小数点时j会有什么值(例如,如果用户输入1.23)? -
如果字符串根本不包含小数点,你认为第一个循环会做什么?例如
"2". -
就风格而言,您不需要
i和k。只需使用j作为两个循环中的循环控制变量。这样您就不需要复制以下值:for (j = 1; x[j] != ‘.’; ++j),然后在两个循环之间将j递增到小数点后使用++j;,然后运行第二个循环for ( ; x[j] != ‘\0’; ++j)。 -
此外,那些重复除以 10 会引入累积的舍入误差。如果您只是将小数点右侧的数字累加为整数值,您将获得更准确的结果,就像第一个循环一样,然后除以
std::pow(10, n),其中n是您的位数锯。
标签: c++