【发布时间】:2014-04-15 00:12:15
【问题描述】:
我的任务有问题。我有我的程序可以运行的地方,但是我在让它正常工作时遇到了问题。我应该定义一个结构类型“auto_t”,并包括制造商、型号、制造和购买日期、油箱盖、油位和里程表的组件。每个都分为 I/O 函数(scan_auto、scan_date、scan_tank、print_auto、print_date、print_tank)并且还编写了一个驱动函数来重复填充和显示一个 auto 结构变量,直到在输入文件中遇到 EOF。示例数据集为:Mercury Sable 1 18 2001 5 30 1991 16 12.5 99892
到目前为止,这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char make[15];
char model[30];
int mmon;
int mday;
int myear;
int pmon;
int pday;
int pyear;
float fuelcap;
float fuellevel;
float odometer;
} auto_t;
/* 输入品牌和型号 */
int scan_auto(auto_t *vehicle) {
return scanf("%s %s", vehicle->make, vehicle->model);
}
/* 记录生产和购买日期 */
int scan_date(auto_t *date) {
return scanf("%d %d %d %d %d %d"
, &date->mmon
, &date->mday
, &date->myear
, &date->pmon
, &date->pday
, &date->pyear);
}
/* 获取燃油和里程表信息 */
int scan_tank(auto_t *tank) {
return scanf("%f %f %f"
, &tank->fuelcap
, &tank->fuellevel
, &tank->odometer);
void print_auto(auto_t vehicle) {
printf("%s %s \n"
, vehicle.make
, vehicle.model);
}
void print_date(auto_t date) {
printf("%d %d %d %d %d %d \n"
, date.mmon
, date.mday
, date.myear
, date.pmon
, date.pday
, date.pyear);
}
void print_tank(auto_t tank) {
printf("%f %f %f \n"
, tank.fuelcap
, tank.fuellevel
, tank.odometer);
}
/* 驱动程序 */
int main(void) {
auto_t vehicle, date, tank;
while(1) {
printf("Please enter the make, then model of the car: ");
scan_auto(&vehicle);
if(scan_auto(&vehicle) == EOF){
break;
}
printf("Please enter the manufacture and purchase dates (ex. 1 18 2001): ");
scan_date(&date);
if(scan_date(&date) == EOF){
break;
}
printf("Please enter the fuel cap, current fuel level (in gallons), and the current odometer reading: ");
scan_tank(&tank);
if(scan_tank(&tank) == EOF){
break;
}
/* Prints all of the cars information */
print_auto(vehicle);
print_date(date);
print_tank(tank);
}
return 0;
}
我的问题是,当我运行程序时,scanf 函数没有正确接收数据,并且 scan_tank 被跳过。最后的打印功能似乎也打印了错误的数据(甚至没有显示品牌和型号),我不确定我正在使用的扫描或打印功能是否有问题。此外,我似乎无法让程序循环结束,并且程序继续运行,直到我关闭它。任何建议将不胜感激。我正在用 C 编写代码并使用 TextWrangler。
【问题讨论】:
-
您的样本数据看起来将里程表作为第一个数字,但扫描会将其与燃料油位一起查看——您需要以正确的顺序读取字段...跨度>
-
不相关:我猜里程表日期信息扫描到传入的 auto 成员中会更有用,而不是扫描到随后在函数返回时丢失的一堆局部变量。
scan_auto也是如此。而且您将所有扫描调用加倍无论如何您需要为每辆汽车调用多少次scan_date(例如)。 -
是的,里程表信息实际上是我按正确顺序排列的,就像我在代码中一样。但是,我什至无法输入里程表数据,因为整个 scan_tank 数据都被跳过了。
标签: c arrays string pointers scanf