c++ - 抛出未处理的异常:读取访问冲突。x 是 0x20B4112
问题描述
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 循环中)出现错误
解决方案
有2个错误:
- 对于第二个循环,将条件更改为
x[k] != '\0'
。 - 该变量
factor
应初始化为0.1
.
此外,为了避免一些运行时错误(例如,在 0.908 的情况下),请从 index 开始第一个循环0
,以便j
在开始第二个循环之前该变量具有有效值。
看看下面的实现:
#include <iostream>
#include <iomanip>
double str_to_double(char x[]) {
int j;
double val1 = 0, val2 = 0.0, factor = 0.1;
for (int i = 0; x[i] != '.'; i++) {
val1 = (val1 * 10) + (x[i] - '0');
j = i;
}
for (int k = j + 2; x[k] != '\0'; k++) {
val2 = val2 + (x[k] - '0')*factor;
factor /= 10;
}
return val1+val2;
}
int main() {
char x[1000];
std::cin.getline(x, 1000);
std::cout<<std::setprecision(15)<<str_to_double(x);
return 0;
}
测试用例:
测试用例 1:输入:
34.908
,输出:34.908
测试用例 2:输入:
0.908
,输出:0.908
测试用例 3:输入:
000006795.989090877700000
,输出:6795.9890908777
PS:对于较大的float
和double
,可能会有精度损失。阅读这篇文章。
推荐阅读
- javascript - ngClass 不会根据变量值改变颜色
- ruby-on-rails - Rails 选择选项根据另一个选择动态变化(没有 ajax)
- parity - 获取最终区块数据
- spring - Spring Boot 谷歌云秘密管理器
- html - Blazor 双向绑定
- hive - Hive SQL - 在没有 `chr()` 的情况下测试 \u0000 (ascii 00)
- airflow - Airflow dag 未按计划运行(而其他计划同时运行)?
- c# - 从控制器操作返回 File(MemoryStream) 时出现内部 nlog 异常
- algorithm - 非退化多边形输出的 Sutherland-Hodgman 算法变体
- python - 使用 OpenCV 删除背景