我有一个包含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
但这会导致分段错误。
谢谢!
答案 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
,而不是投放。