定义了两个CString变量,存放的是字符串格式的浮点数,如下:
CString s1 = "0.01";
CString s2 = "0.1";
分别调用atof将其转换为double类型,atof(s2)运行正确,atof(s1)时,程序出现错误,弹出一对话框:"0x5f43934a"指令引用的"0x0202a17c"内存。该内存不能为"read"。
要终止程序,请单击”确定“。
要调试程序,请单击”取消“。又试了几个其他的值,好像小数点后有两位数或多于两位数时都会出现这个错误,什么原因引起的?

解决方案 »

  1.   

    按道理来说应该是没有这种问题的,atof的参数就是const char*的,这个无论传递什么进去,只要是字符串就可以进行转换的阿……你是不是启用了unicode?
      

  2.   

    应该是你代码的问题,atof时不论cstring有几位小数都没问题的
      

  3.   

    我在VC++ .Net 2003里面试了一下,完全没有问题……
      

  4.   

    如果是VC++6的话你试试看加上一个浮点操作,譬如这样double val = 0;
    val += 1.0;
    CString to_conv("0.11");
    val = atof(to_conv);因为VC++6在加载浮点库的方面有点问题,你看看是不是这个导致的……
      

  5.   

    float f = (float)::strtod(str, NULL);
      

  6.   

    发现仅仅转换本身没有出错,而将转换结果作为参数传递时出错
    函数原型:
    void AutoScan_dp(double start ,double end ,double step);
    调用如下:
    CString szStart(dlg.m_sCurStart);
    CString szEnd(dlg.m_sCurEnd);
    CString szStep(dlg.m_sCurStep);
    start = atof(szStart);
    end = atof(szEnd);
    step = atof(szStep);
             AutoScan_dp(start,end,step);
    当step为0.1时,上面的调用结果正确。当step为0.01时,即出现开始描述的错误,将最后一行函数调用注释掉仅仅是转换时就没有错误,这是为何?用了指针、引用两种方式传递参数均是相同的现象,怎么解释?
      

  7.   

    那应该是你的AutoScan_dp函数里面的代码有错误……
      

  8.   

    是啊,atof的使用没有错,要看你的AutoScan_dp函数是怎么写的了
      

  9.   

    函数AutoScan_dp里唯一用到上述三个参数的是下面的for循环
    for (double dCurrent = start; dCurrent < end; dCurrent += step,i++)
    { ... }
    循环体内没有对start,end,step进行任何操作,也就是说三个参数仅做for循环的判断使用,这样用有什么不妥吗?
      

  10.   

    原来是这个函数捣的鬼:
    函数AutoScan_dp里有以下语句:
        char szCurrent[10];
        _gcvt(dCurrent,7,szCurrent);
    将szCurrent的大小改为50即可,多谢各位。
    不过我只转换了其中的7位,那么szCurrent为10位应该也够用了,为何还出错?