我写了一个获取字符串的程序,然后计算字符串togheder的总值... 例如:
char data[256] = "1$0.83331333333333334$false$false"; // the data
这里我需要做1 + 0.83331333333333334的计算 所以这就是我写的:
char data[256] = "1$0.83331333333333334$false$false"; // the data
double grade = 0;
int i = 0;
int times = 0;
char temp[256] = "";
int flag = 0;
while (flag == 0)
{
times = 0;
if (isdigit(data[i])) // if it's a number
{
if (data[i + 1] == '.') // if it's a double number
{
i = i + 2;
while (isdigit(data[i])) // putting it into a temp array
{
temp[i] = data[i];
i++;
times++;
}
grade = grade + (double)temp / (times * 10);
}
grade = grade + (int)data[i]; // if it's an int number, putting it into grade right away
}
if (data[i] == '\0')
{
flag = 1;
}
i++;
}
printf ("%f\n", grade);
问题在于:
grade = grade + (double)temp / (times * 10);
它表示“在预期浮点值时使用的指针值”。 我真的很清楚这个问题是什么......
谢谢:)
编辑:
感谢您的帮助! 我已经能够将数字转换为字符串.. 所以例如,现在如果我在数据中有大字符串,其中包含几个双精度数,那么每次双重进入一个新字符串时我都可以接受一个循环。 我已经用atof把它转换成了一个双倍,虽然看起来双倍太小了.. 例如 : 我在字符串temp:“83331333333333334”,我在其上使用了atof - >新的双人只有8333313 ...剩下的就像没有进入双人.. 我猜这个数字对于双数来说太大了......所以我该怎么办? 谢谢!
答案 0 :(得分:2)
您不能简单地将char
数组转换为double
,并期望编译器将其视为double
。您需要通过temp
之类的合适函数转换strtod
,然后在计算中使用该值。
请注意,strod
需要C样式的字符串,即以空字符结尾的字符数组。因此,传入temp
是不够的。您需要取消终止temp
,即插入数字后,添加temp[ i ] = 0;
。
这是一个可以帮助您修复错误并帮助您使用strtod
的小程序:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
char data[256] = "1$0.83331333333333334$false$false"; // the data
char *p = strtok( &data[ 0 ], "$" );
while (p) {
double d = strtod( p, NULL );
printf( "extracted value = %.10f\n", d );
p = strtok( NULL, "$" );
}
}
由于OP想要比strtod
更简单的东西:
您可以使用double atof(const char *nptr);
。在我的示例源中,将strtod( p, NULL );
替换为atof( p );
,这应该可以帮助您入门。 atof
和朋友的问题是错误处理很困难,如果无法表示值,则以静默方式调用未定义的行为。
答案 1 :(得分:2)
temp
是一个数组,当在表达式中求值时,它将转换为指向其第一个元素的指针。使用strtod
将字符串转换为double
。