【发布时间】:2017-09-19 20:29:42
【问题描述】:
我有一个程序,我希望使用 fscanf 将汽车数据读入一个 for 循环中的结构数组(我知道,我应该使用 fgets 或其他东西,但它是这个 assinment 所必需的)并排序平均 MPG 数据并使用 fprintf 将排序后的数据输出到新文件。在我读取数据时,在我的 main 函数的 for 循环中,作为调试功能,我打印分配给 struct[i] 的所有数据,然后继续到包含后续数据的文本文件中的下一行结构对象。但是,在所有的数据都输入完毕并且到目前为止一切正常之后,我重新打印了struct数组中的所有信息,前两个数据区域“make”和“model”都取了最后一个struct的字符串分配的。我已经修复了几个小时,但没有找到解决方案。谁能告诉我我的代码做错了什么? 提前谢谢大家!
// Written by 4ur0r4
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Car {
char *make;
char *model;
int year;
int city_mpg;
int highway_mpg;
};
int averagempg(struct Car car) {
return (car.city_mpg + car.highway_mpg) / 2;
}
void selection_sort(struct Car *cars, int n) {
struct Car temp;
int i;
for (i = 0; i < n - 1; i++) {
if (averagempg(cars[i]) > averagempg(cars[i + 1])) {
temp = cars[i];
cars[i] = cars[i + 1];
cars[i + 1] = temp;
}
}
}
void write_cars(struct Car *cars, int n) {
FILE *output = fopen("sorted_cars.txt", "w");
int i;
for (i = 0; i < n; i++) {
fprintf(output, "%s ", cars[i].make);
fprintf(output, "%s ", cars[i].model);
fprintf(output, "%d ", cars[i].year);
fprintf(output, "%d ", cars[i].city_mpg);
fprintf(output, "%d\n", cars[i].highway_mpg);
}
}
void print_cars(struct Car *cars, int n) {
int i;
for (i = 0; i < n; i++) {
printf("%s ", cars[i].make);
printf("%s ", cars[i].model);
printf("%d ", cars[i].year);
printf("%d ", cars[i].city_mpg);
printf("%d\n", cars[i].highway_mpg);
}
}
int main() {
FILE *input = fopen("cars.txt", "r");
struct Car cars[9];
int i;
char make[20], model[20];
int year, city_mpg, highway_mpg;
if (input == NULL) printf("Unable to open file.\n");
else {
for (i = 0; i < 9; i++) {
fscanf(input, "%s %s %d %d %d",
make,
model,
&year,
&city_mpg,
&highway_mpg);
cars[i].make = make;
cars[i].model = model;
cars[i].year = year;
cars[i].city_mpg = city_mpg;
cars[i].highway_mpg = highway_mpg;
printf("%s ", cars[i].make);
printf("%s ", cars[i].model);
printf("%d ", cars[i].year);
printf("%d ", cars[i].city_mpg);
printf("%d\n", cars[i].highway_mpg);
}
printf("\n");
print_cars(cars, 9);
selection_sort(cars, 9);
write_cars(cars, 9);
}
return 0;
}
这是我得到的结果:
Mercury Sable 2009 18 28
Jeep Wrangler 2016 17 21
Honda Civic 2015 31 41
Toyota Corolla 2015 30 42
Toyota Prius 2010 51 48
Ford Escape 2013 23 33
Ford Fusion 2013 25 37
Acura MDX 2014 20 28
Lexus RX 2013 32 28
Lexus RX 2009 18 28
Lexus RX 2016 17 21
Lexus RX 2015 31 41
Lexus RX 2015 30 42
Lexus RX 2010 51 48
Lexus RX 2013 23 33
Lexus RX 2013 25 37
Lexus RX 2014 20 28
Lexus RX 2013 32 28
这是我正在读取的文本文件:
Mercury Sable 2009 18 28
Jeep Wrangler 2016 17 21
Honda Civic 2015 31 41
Toyota Corolla 2015 30 42
Toyta Prius 2010 51 48
Ford Escape 2013 23 33
Ford Fusion 2013 25 37
Acura MDX 2014 20 28
Lexus RX 2013 32 28
【问题讨论】:
标签: c struct printf scanf consistency