我正在尝试执行字符串到双转换。在gnu c编译器中,我得到了正确的值。但是,如果我在嵌入式编译器(renesas CS +)中使用它,则会出现未定义的行为,例如返回无穷大结果。

这是我的代码:

    double str_to_double_func(char a[])
    {
    char str[30] = {'0'};
    int loop ;
    double result;
    int len ;
    int pos,n;
    for(loop = 0;a[loop]!='\0';loop++)
    {
    str[loop] = a[loop];
    }
    str[loop] = '\0';

        pos = 0;

      len = sizeof(str)-1;
       for (n = 0; n < len; n++)
       {
         if (str[n] == '.')
         {
           pos = len - n  - 1;
         }
         else
         {
           result = result * 10.0f + (str[n]-'0');
         }
       }
       while ( pos--)
       {
         result = result/10.0f;
       }
       return result;
     }
   void geo_app_main()
    {
    double d,i;

    d = str_to_double_func("12.345678");

    }


我在CS +编译器(renesas微控制器)中使用的相同代码没有printf语句。当我在模拟器中运行此代码时,它返回无限值(d =无限值)。

现在我更改了代码

double str_to_double_func(char str[])
{
  double result = 0.0;
  int len = 0;
  int pos = 0, n;
while(str[len]!='\0'){
    len++;
}

  for (n = 0; n < len; n++)
  {
    if (str[n] == '.')
    {
      pos = len - n  - 1;
    }
    else
    {
      result = result * 10.0f + (str[n]-'0');
    }
  }

  while ( pos--)
  {
    result = result/1.0f;
  }
  return result;

}

 Here the problem is getting 1.234567800000000E+001 instead of 12.345678 in my CS+(renesasa micro) compiler.i checked this code with cigwin compiler.There i'm getting correct output.


模拟器的输出是
结果=结果1.234567800000000E + 001 double(8)R6:REG,R7:REG

最佳答案

您必须初始化您的result。当您定义

double result;


它不能保证为零。它可以具有任何值,并且可能是垃圾。特别是如果每​​个后续操作都依赖具有有效值的result

result = result * 10.0f + (str[n]-'0');
...
result = result/10.0f;


您应该将变量初始化为

double result = 0.0;


诸如Valgrind的内存检查器可以帮助您查找未初始化值的操作。

还有Sourav Ghosh指出的问题:sizeof则不给您字符串的长度。您应该使用strlen中的<string.h>。但是对于您而言,您实际上并不需要它,因为您已经确定了在loop中复制字符串时的长度。

当然,您也应该将pos显式初始化为零。否则,没有小数点的字符串可能无法正确解析。

(最后,复制字符串不会给您带来任何好处,但是会带来覆盖30个字符的临时缓冲区的危险。)

关于c - 在嵌入式编译器中返回双重函数的字符串返回无穷大结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31447091/

10-11 22:23
查看更多