函数返回无穷大的字符串导致嵌入式编译器

我正在尝试执行字符串到双重转换。 在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 +编译器(瑞萨微控制器)中使用的相同代码没有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 * 10.0f + (str[n]-'0'); ... result = result/10.0f; 

您应该将变量初始化为

 double result = 0.0; 

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

还有Sourav Ghosh指出的问题: sizeof不会给你一个字符串的长度。 您应该使用 strlen 。 但在你的情况下,你并不真的需要它,因为你已经确定了在loop复制字符串时的长度。

而且,当然,你应该明确地将pos初始化为零。 否则,可能无法正确解析没有小数点的字符串。

(最后,复制字符串不会给你带来任何东西,但会引入覆盖30个字符的临时缓冲区的危险。)

除了M Oehm的回答:

你的str_to_double_func过于复杂。 在进行转换之前无需复制字符串。

这是一个更简单的版本:

 #include  #include  double str_to_double_func(char str[]) { double result = 0; int len = strlen(str); int pos = 0, n; 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; }