白牡丹秀色可餐 发表于 2020-3-24 23:54:15

结构体录入信息

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


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

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

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);
}

sunrise085 发表于 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,在不同的编译器下好像不太一样,我这里运行没通过,你试试在你那里能否通过。

白牡丹秀色可餐 发表于 2020-3-25 09:44:32

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

我改了之后还是不行,都只运行到第一本书的title就没办法了,我电脑vs2012只能用scanf_s。

白牡丹秀色可餐 发表于 2020-3-25 10:01:10

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

新建工程后可以啦,谢谢!
页: [1]
查看完整版本: 结构体录入信息