【发布时间】:2020-03-29 17:04:11
【问题描述】:
我刚开始学习 C 语言,但我已经卡在这里一段时间了。我知道有很多类似的问题发布了,但我找不到我的解决方案:(
所以基本上有一个名为“bankdata.csv”的文件,例如:
AC,2023,Jane Smith
TX,2023,2020-02-10,1023.34
AC,5023,Sally Long
TX,2023,2020-02,-103.34
TX,5023,2020-01-15,78.00
TX,5023,2020-03-29,22.00
您只需要查看以“TX”开头的行。数据分别代表类型、账号、日期、金额(存款为正,取款为负)。
我想做的是编写一个函数 balance() ,它将 account num 和 file 作为输入,计算特定帐户的余额并将其输出为浮点数。
这是我尝试过的:
float balance(char* num, FILE* file) {
char line[1000];
file = fopen ("bankdata.csv", "r");
fgets (line, 1000, file);
char *token = strtok (line, ","); // Extract the first token
float bal = 0.00;
while (token != NULL) {
token = strtok (NULL, ","); //next token
//printf (" %s\n", token);
if (strcmp (token, "TX") == 0) {
char *acctnum = strtok (NULL, ",");
if (strcmp (acctnum, num) == 0) {
char *date = strtok (NULL, ",");
char *amount = strtok (NULL, ",");
float am = atof (amount);
bal += am;
}
}
}
return bal;
}
在这里,我使用 while 循环来检查文件中的每一行,并为我想要的行提取“数量”,然后将它们相加。我意识到我没有处理换行符。而且我还遇到了分段错误(核心转储)。谁能帮我解决这个问题?还是有更好的方法?
到目前为止,我并不需要它高效,只希望它尽可能简单!提前谢谢你!
【问题讨论】:
-
您需要围绕
fgets()调用——while (fgets(line, sizeof(line), file) != NULL) { … }进行循环。在进入已有的循环之前提取第一个令牌;然后你提取第二个标记并检查它是否是TX- 它不是。也可能(可能)存在其他问题。 -
请不要使用浮点数来赚钱。浮点数不准确。那里的人很有趣的钱。以整数衡量货币并使用便士或货币等值物
-
@JonathanLeffler 是的,谢谢!
-
如果你在处理真实的银行账户,要么使用
decimal类型(在 C 中尚未标准化,但它们是当前 IEEE 754 标准的一部分,并且一些 FPU 芯片实现了它们 -例如 PowerPC)或使用整数类型并将“美元”(主要货币单位)乘以 100 并将分数加到其中(因此给定“3141.59”,计算3141 × 100 + 59,注意给定“2718.3” ,你需要计算2718 × 100 + 30(不仅仅是3)。小心;如果银行赔钱,人们会感到不安。 -
最好的办法是使用
long long并计算便士。见youtube.com/watch?v=PZRI1IfStY0&t=7s