c - 得到一个奇怪的指针错误,虽然没有使用指针

标签 c

我写了一个程序,获取一个字符串,然后计算这个字符串的总值... 例如:

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);

它说“在预期浮点值的地方使用了指针值”。 我真的不明白这是什么问题......

谢谢:)

编辑:

感谢您的帮助! 我已经能够将数字转换为字符串.. 因此,例如,现在如果我在数据中有一个大字符串,其中有几个 double ,那么每次 double 进入一个新字符串时我都可以进入一个循环。 我已经使用 atof 将其转换为 double,尽管 double 似乎太小了。 例如 : 我在字符串 temp 中有:“83331333333333334”,我在上面使用了 atof -> 新的双倍只有 8333313 ...剩下的就像不进入双倍一样。 我想这个数字对于双数来说太大了……那我该怎么办? 谢谢!

最佳答案

您不能简单地将 char 数组转换为 double 并期望编译器将其视为 double。您需要通过合适的函数(例如 strtod)转换 temp,然后在您的计算中使用该值。

请注意,strod 需要一个 C 风格的字符串,即以 null 结尾的字符数组。因此,仅传入 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 和 friend 的问题是错误处理很困难,如果无法表示该值,您将默默地调用未定义的行为。

关于c - 得到一个奇怪的指针错误,虽然没有使用指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11056411/

相关文章:

c++ - 用位掩码计数

c - 合并排序 - 错误输出

c - 如何检测字符串中的空格?

c 编程 int 变量有多个 '.' s

c - 释放一个等于 malloc 指针的指针

c - keybd_event 不适用于括号和其他一些字符

c - TCP 套接字 : Can read() still fail with EINTR when select() indicates there are data available?

c - 链接器选项的顺序在 .map 文件中是否有所不同?

c - 如何使用strspn查找strspn的arg 2中提到的字符数以外的字符数?

c - 如何为 TMS320F2812 DSP 编写内存屏障?