鱼C论坛

 找回密码
 立即注册
查看: 2432|回复: 7

C求助。。

[复制链接]
发表于 2012-4-11 20:16:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
例如输入两本书的时候,第一次录入信息可以完整录入,第二次录入信息的时候有的直接跳过去了,如直接将书的价格跳过了,这是为什么?谢谢各位大侠!!


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct{
    int year,month,day;
}DATE;
typedef struct book{
        DATE date;
        char name[20];
        char author[10];
        int type;
        float price;
}BOOK;
typedef struct node{
        BOOK book;
        struct node *next;
}Node;
typedef Node *List;
BOOK books[200];
/*初始化*/
void InitializeList(List plist)
{
        plist=NULL;
}
/*添加书本*/
void AddBook(List plist)
{
    FILE *fp;
        int n,m;
        int i=0;
        List a,b,head;
        head=NULL;
        a=b=(struct node *)malloc(sizeof(struct node));
        printf("请输入要输入几本书:");
    scanf("%d",&n);
        while(i<n){
        printf("请输入书本购买日期(年 月 日):");
        scanf("%d %d %d",&a->book.date.year,&a->book.date.month,&a->book.date.day);
        printf("请输入书本名字:");
        scanf("%s",a->book.name);
        printf("请输入作者名字:");
        scanf("%s",a->book.author);
        printf("请输入书本类型:");
        scanf("%d",&a->book.type);
        printf("请输入书本价格:");
        scanf("%.2f",&a->book.price);
        if(i==0)head=a;
        else b->next=a;
                b=a;
        a=(struct node *)malloc(sizeof(struct node));
        i++;
        };
        a=head;
    for(m=0;m<n;m++){
                books[m].date.year=a->book.date.year;
                books[m].date.month=a->book.date.month;
                books[m].date.day=a->book.date.day;
                strcpy(books[m].name,a->book.name);
                strcpy(books[m].author,a->book.author);
                books[m].type=a->book.type;
                books[m].price=a->book.price;
                a=a->next;
        };
        for(m=0;m<n;m++)
                fread(&books[m],sizeof(struct book),1,fp);
}
void main()
{
        List plist;
    plist=(struct node *)malloc(sizeof(struct node));
    InitializeList(plist);
    AddBook(plist);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-4-11 22:10:12 | 显示全部楼层
两处错误吧

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct{
    int year,month,day;
}DATE;
typedef struct book{
        DATE date;
        char name[20];
        char author[10];
        int type;
        double price;//可以改成double
}BOOK;
typedef struct node{
        BOOK book;
        struct node *next;
}Node;
typedef Node *List;
BOOK books[200];
/*初始化*/
void InitializeList(List plist)
{
        plist=NULL;
}
/*添加书本*/
void AddBook(List plist)
{
    FILE *fp;
        int n,m;
        int i=0;
        List a,b,head;
        head=NULL;
        a=b=(struct node *)malloc(sizeof(struct node));
        printf("请输入要输入几本书:");
    scanf("%d",&n);
        while(i<n){
        printf("请输入书本购买日期(年 月 日):");
        scanf("%d %d %d",&a->book.date.year,&a->book.date.month,&a->book.date.day);
        printf("请输入书本名字:");
        scanf("%s",a->book.name);
        printf("请输入作者名字:");
        scanf("%s",a->book.author);
        printf("请输入书本类型:");
        scanf("%d",&a->book.type);
        printf("请输入书本价格:");
        scanf("%lf",&a->book.price); // scanf("%.2f",&a->book.price);这里是第一处错误的地方
        if(i==0)head=a;
        else b->next=a;
                b=a;
        a=(struct node *)malloc(sizeof(struct node));
        i++;
        };
        a=head;
for(m=0;m<n;m++){
                books[m].date.year=a->book.date.year;
                books[m].date.month=a->book.date.month;
                books[m].date.day=a->book.date.day;
                strcpy(books[m].name,a->book.name);
                strcpy(books[m].author,a->book.author);
                books[m].type=a->book.type;
                books[m].price=a->book.price;
                a=a->next;
        };
        for(m=0;m<n;m++)
  {
   //fread(&books[m],sizeof(struct book),1,fp); //这里是第二处错误的地方
   printf("%d %d %d\n",books[m].date.year,books[m].date.month,books[m].date.day);
   printf("%s\n",books[m].name);
   printf("%s\n",books[m].author);
   printf("%d\n",books[m].type);
   printf("%.2lf\n",books[m].price);         
  }}
void main()
{
        List plist;
    plist=(struct node *)malloc(sizeof(struct node));
    InitializeList(plist);
    AddBook(plist);
}




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-4-11 23:15:37 | 显示全部楼层

谢谢大神了!
但是为什么 printf("请输入书本价格:");
        scanf("%.2f",&a->book.price);
把“.2”去掉就正常了,而加上之后就会导致第二次循环输入时部分被跳过呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-4-12 08:12:47 | 显示全部楼层
我是初学者,scanf函数不能用%.2f格式吧,不能指定数据的精度。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-4-12 10:20:52 | 显示全部楼层
scanf()函数中没有精度控制。scanf("%.2f",&a->book.price);是非法的。不能企图用此语句输入小数为2位的实数。还有我不明白你用fread函数的目的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-4-12 21:40:23 | 显示全部楼层
hkcx3000 发表于 2012-4-12 08:12
我是初学者,scanf函数不能用%.2f格式吧,不能指定数据的精度。

谢谢,我明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-4-12 21:42:09 | 显示全部楼层
Lei 发表于 2012-4-12 10:20
scanf()函数中没有精度控制。scanf("%.2f",&a->book.price);是非法的。不能企图用此语句输入小数为2位的实数 ...

谢谢,我明白了,fread函数那点开始是想导入数据到文件的,用错函数了,已经自己改正了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-4-13 00:17:15 | 显示全部楼层
Crown 发表于 2012-4-11 23:15
谢谢大神了!
但是为什么 printf("请输入书本价格:");
        scanf("%.2f",&a->book.price);

你用的%.2f是printf的输出格式,不可能在scanf中用的!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 02:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表