c语言 图书馆信息管理系统


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct user
{
    char users_number[20];  //*用户编号
    char name[20];            //*用户名
    char password[20];        //*密码,只能是至多20位的字符,可以是数字+字母+各种符号
};
struct user users[10000];
FILE *fp;
int users_m;                //*users_m为已注册的用户的数量
void users_count()            //*计算每次打开登录注册界面是系统内已注册的用户数量并把已注册的用户信息存入用户的结构体数组中
{
    char s[10000][1000];
    int i=1,k;
    fp=fopen("users.txt","r");
    fscanf(fp,"%s,",&s[0]);
    if(fp==NULL)            //*检测文件是否成功打开
    {
        printf("cannot find the file");
        exit(0);
    }
    for(;s!=(void *)0;i++)
    {
        fscanf(fp,"%s,",&s[i]);
    }
    fclose(fp);
    users_m=atoi(s[i-3]);
    for(i=0,k=0;i<users_m;k++)
    {
        if(k%3==0)
        {    
            for(i=0;i<strlen(s[k]);i++)
            {
                users[i].users_number[i]=s[k][i];
            }
        }
        else if(k%3==1)
        {    
            for(i=0;i<strlen(s[k]);i++)
            {
                users[i].name[i]=s[k][i];
            }
        }
        else
        {    
            for(i=0;i<strlen(s[k]);i++)
            {
                users[i].password[i]=s[k][i];
            }
        }
        if(i!=0&&k%3==2)
            i++;
    }
}
int again(char string[])   //*检测输入的用户名是否已经被注册过,0代表已被注册过,1代表未被注册过
{
    int i,v=1,j,k=0;
    for(i=0;i<users_m;i++)
    {
        if(strlen(string)==strlen(users[i].name))
        {
            for(j=0;j<strlen(users[i].name);j++)
            {
                if(string[j]!=users[i].name[j])
                {
                    k=1;
                    break;
                }
            }
        }
        if(k==1)
        {    
            k=0;
            continue;
        }
        else
        {
            v=0;
            return v;
        }
    }
    return v;
}
void reg()  //*用户注册的函数,结尾要把成功注册的用户信息录入users.txt中
{
    char s[20];
    int i;
    system("cls");
    printf("请输入用户名: ");
    scanf("%s",&s);
    while(again(s)==0)
    {
        system("cls");
        printf("该用户名已被注册!请重新输入用户名: ");
        scanf("%s",&s);
    }
    users_m++;
    int j=users_m;
    char string[20];
    int k;
    for(k=0;j!=0;)        //*计算users_m长度
    {
        itoa(j%10,string+k,10);
        j=j/10;
        k++;
    }
    for(i=0;i<k;i++)
    {
        users[users_m].users_number[i]=string[k-i-1];
    }
    for(i=0;i<strlen(s);i++)
    {
        users[users_m].name[i]=s[i];
    }
    printf("请输入密码: ");
    scanf("%s",&users[users_m].password);
    printf("注册成功!");
    fp=fopen("users.txt","a");
    if(fp==NULL)            //*检测文件是否成功打开
    {
        printf("cannot find the file");
        exit(0);
    }
    fprintf(fp,"%s,%s,%s,",users[users_m].users_number,users[users_m].name,users[users_m].password);
    fclose(fp);
} 
int main()
{
    users_count()    ;
        reg();
    system("cls");
    return 0;
}

为什么一引用users_count()程序就不响应,但又不报错。users_count()函数哪里写得有问题呀?users_count()函数的功能是把文件里已有的用户信息存到结构体数组里并计算已有的用户数。

img

fscanf(fp,"%s,",&s[0]);不要&,就已经做到你想要的功能了

【以下回答由 GPT 生成】

优化后的代码对比优化前的代码进行了以下改进:

  1. 将结构体数组 users 的声明从全局变量移动到了 users_count 函数内部,并将其大小调整为根据实际需求确定的大小。
  2. 将局部变量 users_m 的声明放在了函数内部,并在声明时初始化为0。
  3. 在打开文件 users.txt 之前,对文件是否成功打开进行了检查,并在未成功打开时输出相应提示信息并退出程序。
  4. 改用 while 循环来读取文件内容,取代了原先的 for 循环。
  5. 使用 strcpy 函数将字符串赋值给结构体数组的相应字段,代替了原来的逐个字符赋值的操作。

这些改进提高了代码的可读性、可维护性和可靠性。


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