首页 > 解决方案 > 抛出未处理的异常:读取访问冲突。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 循环中)出现错误

标签: c++

解决方案


有2个错误:

  1. 对于第二个循环,将条件更改为x[k] != '\0'
  2. 该变量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. 测试用例 1:输入:34.908,输出:34.908

  2. 测试用例 2:输入:0.908,输出:0.908

  3. 测试用例 3:输入:000006795.989090877700000,输出:6795.9890908777

PS:对于较大的floatdouble,可能会有精度损失。阅读这篇文章


推荐阅读