C语言结构体:图书馆数据查找系统输入问题

做一个图书馆数据的输入程序,用结构体,第一行输入书本个数,之后每一行输入顺序依次是:书名(char),书本编号(int),书本地址(int)。
问题:第一行输入的书本个数无论是多少,之后最多只能输入3行。
代码如下:

#include
#include
int main()
{   
    int a,b;
    int ch;
    
    struct m{
        int number;
        char *name;
        float cost;
        int id;
    }library[100];
    
    scanf("%d",&a);
    for(b=0;b//gets();
        scanf("%s%f%d",library[b].name,&library[b].cost,&library[b].id);
        (library[b].number)++;    
    }

参考GPT和自己的思路:您的代码存在几个问题。首先,结构体中的name成员变量应该是一个字符数组而不是一个指针。其次,在循环中应该判断输入的行数是否超过3行。最后,根据题目要求应该给每个图书对象初始化number成员变量为0,而不是在输入时递增。

下面是修正后的代码:

#include <stdio.h>
#include <string.h>

struct book {
    int number;
    char name[50];
    int id;
};

int main() {
    int book_count;
    scanf("%d", &book_count);

    struct book library[100];
    for (int i = 0; i < book_count; i++) {
        if (i >= 3) {
            printf("You can only input up to 3 books\n");
            break;
        }
        memset(library[i].name, 0, sizeof(library[i].name)); // 初始化字符串
        scanf("%s %d %d", library[i].name, &library[i].id, &library[i].number);
        library[i].number = 0; // 初始化number成员变量
    }

    // 输出输入的书籍信息
    for (int i = 0; i < book_count && i < 3; i++) {
        printf("Book %d: %s, ID: %d, number: %d\n", i + 1, library[i].name, library[i].id, library[i].number);
    }

    return 0;
}

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:

  问题可能是由于输入时混淆了换行符导致的。可以尝试在输入完每一行后使用getchar()清空缓冲区,避免换行符对下一次输入造成干扰。此外,结构体中的name应该使用字符数组而不是字符指针,并在结构体定义中指定其最大长度,以避免缓冲区溢出。

以下是修改后的代码示例:

#include <stdio.h>
#include <string.h>

#define MAX_NAME_LENGTH 100

struct book {
    int number;
    char name[MAX_NAME_LENGTH];
    int id;
};

int main() {
    int n;
    printf("请输入书本个数:\n");
    scanf("%d", &n);

    struct book library[100];
    int i;
    for (i = 0; i < n; i++) {
        printf("请输入第%d本书的信息(书名 书本编号 书本地址):\n", i + 1);
        scanf("%s%d%d", library[i].name, &library[i].number, &library[i].id);
        getchar(); // 清空缓冲区
    }

    printf("输入完毕,共输入%d本书的信息:\n", n);
    for (i = 0; i < n; i++) {
        printf("第%d本书:名称=%s 编号=%d 地址=%d\n", i + 1, library[i].name, library[i].number, library[i].id);
    }

    return 0;
}

如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

你的name没有分配内存就输入了。name应该定义成字符数组,或者用malloc函数分配内存。这个是定义成字符数组的改法:

#include<stdio.h>
#include<string.h>
int main()
{   
    int a,b;
    int ch;
    
    struct m{
        int number;
        char name[100];
        float cost;
        int id;
    }library[100];
    
    scanf("%d",&a);
    for(b=0;b<a;b++)
    {
        //gets();
        scanf("%s%f%d",library[b].name,&library[b].cost,&library[b].id);
        (library[b].number)++;    
    }
}

这是运行结果:

img

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^