【问题标题】:Error in Advanced C assignment高级 C 分配错误
【发布时间】: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


【解决方案1】:

已编辑:

代码中还有其他问题:

  1. scanf不是为了性能,date-&gt;&amp;pyear完全是 错误,因为pyeardate 的成员,如果您想访问pyear,请使用data-&gt;pyear&amp;date-&gt;pyear 表示 &amp;(date-&gt;pyear),因为-&gt; 的优先级高于&amp;
  2. 函数scan_autoscan_datescan_tank被调用 两次,我知道我不想那样,所以

//scan_auto(&vehicle); if(scan_auto(&vehicle) == EOF) if 语句中的行也将被执行,因此请注释上面的行,其他“扫描”函数也是如此。 编辑 2:

#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()
{
auto_t vehicle;
auto_t date;
auto_t tank;
while(1) {
    printf("Please enter the make, then model of the car: \n");
    //scan_auto(&vehicle);
    if(scan_auto(&vehicle) == EOF){
        break;
    }
    printf("Please enter the manufacture and purchase dates (ex. 1 18 2001): \n");
    //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: \n");
    //scan_tank(&tank);
        if(scan_tank(&tank) == EOF){
            break;
        }
    print_auto(vehicle);
    print_date(date);
    print_tank(tank);

    }
return 0;
}

【讨论】:

  • 谢谢,实施了更改,它肯定比我第一次做的方式更有效。我仍然有我的主要问题。每当程序运行时,它都会按照应有的品牌和型号运行,但是,在我输入答案后,它不会继续前进到下一个 printf,因此 scanf 接收到的数据超出了应有的数据,并且 scan_tank 函数正在一起跳过。最后,最终的 printf 函数没有将正确的数据打印到屏幕上,从而将品牌和型号完全排除在数据集之外。
  • 按照您的建议注释掉了扫描功能,没有任何改变,但它仍然有效。无法使用date-&gt;pyear,因为它会导致弹出:警告:格式指定类型“int *”但参数的类型为“int”[-Wformat]
  • 谢谢它解决了我原来的问题。所以事后看来,在 int main(void) { 中有 void 是没有意义的,但是 auto_t 车辆又是什么呢? auto_t 日期; auto_t tank;auto_t vehicle, date, tank;?
  • int main(void) 没问题,参数只用于调用时命令行中的输入参数,如果没有参数,我的习惯是不使用void。并像你一样声明结构也可以。我改变只是为了测试。
猜你喜欢
  • 2017-08-10
  • 2014-04-28
  • 1970-01-01
  • 2014-05-19
  • 1970-01-01
  • 2013-02-28
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多