鱼C论坛

 找回密码
 立即注册
查看: 539|回复: 3

[已解决]结构体录入信息

[复制链接]
发表于 2020-3-24 23:54:15 | 显示全部楼层 |阅读模式

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

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

x
可以运行,但在录入书本信息时就错误了,请问是为什么?


#include<stdio.h>
#include<stdlib.h>

struct Date{
        int year;
        int month;
        int day;
};
struct Book {
        char title[30];
        char author[30];
        int price;
        struct Date date;
        char publisher[30];
}library[10];

void getInput(struct Book *b)
{
        printf("title:");
        scanf_s("%s",(*b).title);
        printf("\nauthor:");
        scanf_s("%s",(*b).author);
        printf("\nprice:");
        scanf_s("%d",&(*b).price);
        printf("\ndate:");
        scanf_s("%d%d%d",(*b).date.year,(*b).date.month,(*b).date.day);
        printf("\npublisher:");
        scanf_s("%s",(*b).publisher);

}
void outPut(struct Book *b)
{
        int i;
        for(i=0;b+i!=NULL;i++)
        {
                printf("NO.%d\n",b+1+i);
                printf("title:%s\n",(b+i)->title);
                printf("author:%s\n",(b+i)->author);
                printf("price:%d\n",(b+i)->price);
                printf("date:%d.%d.%d\n",(b+i)->date.year,(b+i)->date.month,(b+i)->date.day);
                printf("publisher:%s\n",(b+i)->publisher);
                printf("\n==========next=========\n");
        }
}
void main()
{
        int i,n;
        struct Book *b;
        b = library;
        printf("书本数:");
        scanf_s("%d",&n);
        for(i=0;i<n;i++)
        {
                b++;
                printf("第%d本书数据:\n",i+1);
                getInput(b);
                printf("\n===========本书录入完毕=========\n");
        }
        outPut(b);
}
最佳答案
2020-3-25 09:23:16
错误不少
1、scanf_s需要三个参数,第三个参数是输入的字符数,这个参数是必须的。scanf_s是要比scanf安全,但是使用限制也要多一些,必须要设定读取长度,
2、在getInput中,scanf_s读取日期的时候没有加 &,你所定义的日期架构提中的三个成员都是int
3、主函数for循环中,b++ 应该放在getInput之后,你需要先输入一本书,然后再向后移动指针
4、for循环结束后,outPut之前需要把指针b复位 b = library;,因为for循环结束时,指针b已经到了数组的末尾了,
5、outPut中的for循环条件b+i!=NULL,在不同的编译器下好像不太一样,我这里运行没通过,你试试在你那里能否通过。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-25 09:23:16 | 显示全部楼层    本楼为最佳答案   
错误不少
1、scanf_s需要三个参数,第三个参数是输入的字符数,这个参数是必须的。scanf_s是要比scanf安全,但是使用限制也要多一些,必须要设定读取长度,
2、在getInput中,scanf_s读取日期的时候没有加 &,你所定义的日期架构提中的三个成员都是int
3、主函数for循环中,b++ 应该放在getInput之后,你需要先输入一本书,然后再向后移动指针
4、for循环结束后,outPut之前需要把指针b复位 b = library;,因为for循环结束时,指针b已经到了数组的末尾了,
5、outPut中的for循环条件b+i!=NULL,在不同的编译器下好像不太一样,我这里运行没通过,你试试在你那里能否通过。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-25 09:44:32 | 显示全部楼层
sunrise085 发表于 2020-3-25 09:23
错误不少
1、scanf_s需要三个参数,第三个参数是输入的字符数,这个参数是必须的。scanf_s是要比scanf安全 ...

我改了之后还是不行,都只运行到第一本书的title就没办法了,我电脑vs2012只能用scanf_s。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-25 10:01:10 | 显示全部楼层
sunrise085 发表于 2020-3-25 09:23
错误不少
1、scanf_s需要三个参数,第三个参数是输入的字符数,这个参数是必须的。scanf_s是要比scanf安全 ...

新建工程后可以啦,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-4-28 04:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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