我正在尝试执行字符串到双转换。在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/