我正在尝试执行字符串到双重转换。 在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]!=' ';loop++) { str[loop] = a[loop]; } str[loop] = ' '; 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]!=' '){ 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; }
以上就是c/c++开发分享函数返回无穷大的字符串导致嵌入式编译器相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/519053.html