1

我编写了一个获取字符串的程序,然后计算字符串的总值 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只是......其余的就像不进入双重......我猜这个数字对于双重数字来说太大了......那我该怎么办?谢谢!

4

2 回答 2

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 );by atof( p );,这应该可以帮助您入门。和朋友的问题atof是错误处理很困难,如果无法表示该值,您将默默地调用未定义的行为。

于 2012-06-15T18:41:10.017 回答
2

temp是一个数组,当在表达式中求值时,它被转换为指向其第一个元素的指针。用于strtod将字符串转换为double.

于 2012-06-15T18:41:27.397 回答