类型转换char指针在C中浮动

时间:2013-09-09 13:24:53

标签: c parsing casting

我有一个包含ff数据的平面文件:

date;quantity;price;item

我想使用以下结构创建数据记录:

typedef struct {
  char * date, * item;
  int quantity;
  float price, total;
} expense_record;

我创建了以下初始化方法:

expense_record initialize(char * date, int quantity, char *price, char *item) {
  expense_record e;
  e.date = date;
  e.quantity = quantity;
  e.item = item;
  /* set price */
  return e;
}

我的问题是如何将价格设置为float(根据结构要求)char *price。我得到的最接近的,即没有产生编译器错误是

 e.price = *(float *)price

但这会导致分段错误。

谢谢!

3 个答案:

答案 0 :(得分:4)

您正在寻找 strtod strtof库函数(包括<stdlib.h>)。相关地,如果调用代码使用strtoul之外的任何内容将quantity从文本转换为int,那可能是一个错误(我能想到的唯一例外是,如果是某些原因quantity可能是否定的,那么您需要strtol代替。)

答案 1 :(得分:1)

要将文字转换为float,请使用strtof()strtod()更适合double 您的初始化例程可能需要`日期等的副本 建议改进的例程如下:

expense_record initialize(const char * date, int quantity, const char *price, const char *item) {
  expense_record e;
  char *endptr;
  e.date = strdup(date);
  e.quantity = quantity;
  e.item = strdup(item);
  if (!e.date || !e.item) {
    ; // handle out-of -memory
  }
  e.price = strtof(price, &endptr); 
  if (*endptr) {
    ; // handle price syntax error
  }
  return e;
}

顺便说一句:建议进行额外的更改以将初始化传递到目标记录,但这会进入更高级别的架构。

答案 2 :(得分:0)

您遇到分段错误,因为float有4个字节:当您创建*(float *)price时,您正在访问前4个字节的价格,因此如果价格大小小于4个字符,你会有错误的。

我认为你所能做的最好的事情就是在解析数据时读取float而不是char *(因为我对数量有所了解),例如fscanf (pFile, "%s;%d;%f;%s", &date, &quantity, &price, &item);

或使用strtod转换为float中的initialize,而不是投放。