获得一个奇怪的指针错误,但不使用指针

时间:2012-06-15 18:39:15

标签: c

我写了一个获取字符串的程序,然后计算字符串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 ...剩下的就像没有进入双人.. 我猜这个数字对于双数来说太大了......所以我该怎么办? 谢谢!

2 个答案:

答案 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