C语言编写停车场系统(有漏洞)

#include <stdio.h>  

#include <stdlib.h>  

#include <string.h>  

#include <time.h>  

#define N 4  

#define M 5  

#define money_min 0.1  //该停车场每分钟停车费用  

  

void taxi();  

void buy();  

void search();  

void menu();  

void put();  

void manage();  

int  check1(int cnum,char key[]);  

int  check2(int cnum);  

  

int count=0;             //count为已停车位  

int insert_num=0;        //管理员每次要存入信息的人数  

int insert_sum=0;       //存入信息总人数  

int car[N][M]={0};      //车位停车情况,1为已停车,0为未停车  

  

//停车人信息,carnum为车牌号,ts,te,to分别为开始停车时间,结束停车时间,停车时间  

struct stud  

{  

    char carnum[35];  

    int ts,te,to;  

}cus[N][M];  

  

//停车卡信息,num卡号,password密码,money余额,最多存储100个车卡信息  

struct stub  

{  

    int num;  

    char password[35];  

    double money;  

}inf[100];  

  

//管理员信息,name姓名,num卡号,password为密码  

struct stup  

{  

    char name[25];  

    int num;  

    char password[35];  

}manager;   

  

int main()  

{  

    strcpy(manager.name,”hehe”);  

    manager.num=10000;  

    strcpy(manager.password,”without”);  

    while(1)  

    {  

        menu();  

        printf(“请输入您的选择,同时按回车键确认:”);  

        while(1)  

        {  

            int sel;  

            scanf(“%d”,&sel);  

            fflush(stdin);  

            switch(sel)  

            {             

            case 1:search();break; //停车状态查询           

            case 2:taxi();break;   //停车           

            case 3:buy();break;    //取车   

            case 4:put();break;    //自助充值  

            case 5:manage();break; //管理员管理系统  

            case 0:system(“pause”);system(“cls”);break;  

            default :printf(”           输入错误,请重新输入\n”);  

  

            }  

            if(sel>=0 && sel<=5) break;  

        }  

    }  

    return 0;  

}  

  

//充值函数  

void put()  

{  

    int num,i;  

    printf(“充值系统已开启:\n”);  

    printf(“注意您每次的充值仅限为100RMB!\n”);  

    printf(“请输入您的卡号:”);  

    scanf(“%d”,&num);  

    fflush(stdin);  

    if(num==0)  

    {  

        system(“cls”);  

        return ;  

    }  

    printf(“请放好您的人民币\n”);  

    system(“pause”);  

    //充值操作  

    for(i=0;i<insert_sum;i++)  

        if(num==inf[i].num)  

    {  

        inf[i].money+=100;  

        FILE *ft;  

        ft=fopen(“pass.txt”,”a”);  

        time_t t=time(NULL);  

        char *time=ctime(&t);  

        fprintf(ft,”id=%d,password=%s,money=%.1lf,time=%s”,inf[i].num,inf[i].password,inf[i].money,time);  

        fclose(ft);  

        break;  

    }  

    printf(“充值成功,您的停车卡余额:%.1lf\n”,inf[i].money);  

    system(“pause”);  

    system(“cls”);  

    return ;  

}  

  

//管理员管理函数  

void manage()  

{  

    char name[25];  

    int num;  

    char password[35];  

    while(1)  

    {  

        printf(“请输入姓名:”);  

        scanf(“%s”,name);  

        fflush(stdin);  

        if(strcmp(name,”0″)==0)  

        {  

            system(“cls”);  

            return ;  

        }  

        printf(“请输入卡号:”);  

        scanf(“%d”,&num);  

        fflush(stdin);  

        if(num==0)  

        {  

            system(“cls”);  

            return ;  

        }  

        printf(“请输入密码:”);  

        scanf(“%s”,password);  

        fflush(stdin);  

        if(strcmp(password,”0″)==0)  

        {  

            system(“cls”);  

            return ;  

        }  

        if( !(strcmp(name,manager.name)==0 && (num==manager.num) &&  

           strcmp(password,manager.password)==0) )  

        {  

            printf(“输入错误,请重新输入!\n”);  

            system(“pause”);  

            system(“cls”);  

            continue;  

        }  

        else break;  

    }  

    printf(“输入正确!\n”);  

    int p_num,i;  

    FILE *fp;  

    printf(“请输入您要添加信息的人数:”);  

    scanf(“%d”,&p_num);  

    //取当前系统时间  

    time_t t=time(NULL); //调用时间函数  

    insert_num=p_num;  

    system(“pause”);  

    for(i=0;i<=p_num;i++)  

    {  

        system(“cls”);  

        if(i==p_num) //该次添加人数已满  

        {  

            printf(“本次添加人数已满,将返回菜单模式!\n”);  

            system(“pause”);  

            system(“cls”);  

            continue;  

        }  

        printf(“已添加信息的人数:%d,剩余添加信息的人数:%d\n”,i,insert_num);  

        fp=fopen(“pass.txt”,”a”);  

        char *time=ctime(&t); //记录此处的时间  

        int _num,flag;  //_num为停车卡所属者的卡号,flag为判断卡号是否有重复  

        while(1)  

        {  

            printf(“卡号:”);  

            scanf(“%d”,&_num);  

            fflush(stdin);  

            if(_num==0)  

            {  

                system(“cls”);  

                return ;  

            }  

            flag=check2(_num);  

            if(flag==1)  

            {  

                printf(“信息已存在,请重新输入!\n”);  

                continue;  

            }  

            else break;  

        }  

        inf[insert_sum].num=_num;  

        printf(“密码:”);  

        scanf(“%s”,inf[insert_sum].password);  

        fflush(stdin);  

        printf(“金额:”);  

        scanf(“%lf”,&inf[insert_sum].money);  

        fflush(stdin);  

        fprintf(fp,”id=%d,password=%s,money=%.1lf,time=%s”,inf[insert_sum].num,  

                inf[insert_sum].password,inf[insert_sum].money,time); //讲信息读入文件保存以供管理员查询  

        fclose(fp);  

        printf(“添加信息成功!\n”);  

        insert_num–;  

        insert_sum++;  

        system(“pause”);  

        system(“cls”);  

    }  

}  

  

//查询重复号  

int check2(int _num)  

{  

    int flag=0; //flag=1表示该号已存在,0表示不存在  

    int i;  

    for(i=0;i<insert_sum;i++)  

        if(_num==inf[i].num)  

    {  

        flag=1;break;  

    }  

    return flag;  

}  

  

//查询功能,cnum为卡号,key数组为持卡人输入的密码  

int check1(int cnum,char key[])  

{  

     int flag=-1,i;  

     for(i=0;i<insert_sum;i++) //  

         if(inf[i].num==cnum)  

         {  

             if(strcmp(inf[i].password,key)==0)  

             {  

                flag=i;break;  

             }  

  

         }  

     return flag;  

}  

  

//取车系统  

void buy()  

{  

    char carnum[35];  

    int num;  

    while(1)  

    {  

        printf(“请输入您的停车号:”);  //停车号为num,则在密码数组中的号码为num-1;  

        scanf(“%d”,&num);  

        fflush(stdin);  

        if(num==0)  

        {  

            system(“cls”);  

            return ; //返回主菜单  

        }  

        if( !(num>0 && num<=N*M)) //停车号不大于最大停车数量  

        {  

            printf(“输入错误,请重新输入!\n”);  

            continue;  

        }  

        else ;  

        while(1)  

        {  

            printf(“请输入您的车牌号:”); //车牌号为15个字符内  

            scanf(“%s”,carnum);  

            fflush(stdin);  

            if(strlen(carnum)>=15)  

            {  

                printf(“输入错误,请重新输入!\n”);  

                continue;  

            }  

            else break;  

        }  

        if(strcmp(carnum,cus[num/N][num%N-1].carnum)!=0) //当前用户所停车位的车牌号,与先前输入的车牌号不相同  

        {  

            printf(“输入错误,请重新输入!\n”);  

            continue;  

        }  

        else break;  

    }  

    int cnum,flag;  

    char key[35];  

    while(1)  

    {  

        printf(“刷卡消费,请输入您的卡号:”);  

        scanf(“%d”,&cnum);  

        fflush(stdin);  

        printf(“请输入您的密码:”);  

        gets(key);  

        fflush(stdin);  

        flag=check1(cnum,key);  //检查卡号和密码是否匹配  

        if(flag==-1)  

        {  

             printf(“输入错误,请重新输入,必要时与管理员联系!\n”); //注意flag变量的作用  

             continue;  

        }  

        else break;  

    }  

    printf(“输入正确\n”);  

    system(“pause”);  

    system(“cls”);  

  

    //计录结束停车时间,并计算该车的停车时间  

    cus[num/N][num%N-1].te=time(NULL); //结束该车的停车时间  

    cus[num/N][num%N-1].to=cus[num/N][num%N-1].te-cus[num/N][num%N-1].ts;  

    int time_min=cus[num/N][num%N-1].to/60;  

    time_min= (cus[num/N][num%N-1].to-time_min*60)!=0 ? time_min+1 : time_min; //不足一分钟按一分钟计算  

    printf(“您的本次停车费用:%.1lfRMB\n”,time_min*money_min);  

  

    while(inf[flag].money<time_min*money_min) //当余额不足时,调用充值系统  

    {  

        printf(“您的余额为%.1lf,不足,请充值\n”,inf[flag].money);  

        put();  //调用充值系统  

    }  

  

    //扣除费用  

    inf[flag].money-=time_min*money_min;  

    printf(“您的停车时间:%dmin\n”,time_min);  

    printf(“每分钟停车费用:%.1lfRMB\n”,money_min);  

    printf(“缴费后您的余额为:%.1lfRMB\n”,inf[flag].money);  

    printf(“缴费成功!\n”);  

    count–;//该车离开,所停总车位-1  

    int _num;  

    srand((unsigned)time(NULL)); //调用随机函数,为该车分配出口离开  

    _num=rand()%2;  

    printf(“请选择%d号出口,欢迎下次光临\n”,flag+1);  

  

    //清除某车离开后该车在在停车场某车位原有的信息  

    car[num/N][num%N-1]=0;  

    strcpy(cus[num/N][num%N-1].carnum,”\0″);  

    cus[num/N][num%N-1].ts=0;  

    cus[num/N][num%N-1].te=0;  

    cus[num/N][num%N-1].to=0;  

    system(“pause”);  

    system(“cls”);            

}  

  

//停车系统  

void taxi()  

{  

    char carnum[35];  

    int i,j,flag=0;  

                    //添加停车提示,为完成  

    while(1)  

    {  

        printf(“请输入您的车牌号:”); //车牌号含有汉字,字母和数字,用字符  

        scanf(“%s”,carnum);  

        fflush(stdin);  

        if(strcmp(carnum,”0″)==0)  

        {  

            system(“cls”);  

            return ; //返回主菜单  

        }  

        if(strlen(carnum)>=35)  

        {  

            printf(“输入错误,请重新输入!\n”);  

            continue;  

        }  

        else break;  

    }  

    for(i=0;i<N;i++)  

    {  

        for(j=0;j<M;j++)  

        {  

            if(car[i][j]==0)    //寻找空余可停车位  

            {  

                printf(“分配给您的车位:”);  

                printf(“%d\n”,i*N+j+1);    //i*N+j+1 为所停车位号  

                car[i][j]=1;  

                strcpy(cus[i][j].carnum,carnum);  //count 为已停车位的数目  

                flag=1;  

                break;  

            }  

        }  

        if(flag==1) break;  

    }  

    if(flag==0)  

    {  

        printf(“尊敬的用户,您好,该停车场已满,请找其他停车场\n”);  

        system(“pause”);  

        system(“cls”);  

    }  

    else  

    {  

        count++;  

        system(“pause”);  

        cus[i][j].ts=time(NULL); //计时开始  

        system(“cls”);  

    }  

    return ;  

}  

  

//查询系统  

void search()  

{  

    printf(“\t\t\t *******欢迎使用智能停车场系统*******\n”);  

    printf(“\t\t\t ******************\n”);  

    int i,j;  

    for(i=0; i<N; i++)  

    {  

        printf(“\t\t\t  “);  

        for(j=0;j<M;j++)  

        {  

            printf(” ┃”);  

            if(car[i][j]==1)  

            {  

                printf(” ■ “);  

            }  

            else  

            {  

                printf(” □ “);  

            }  

        }  

        printf(” ┃\n”);  

        printf(“\t\t\t  “);  

        for(j=i*M+0;j<=i*M+N;j++)  

        {  

            printf(” ┃”);  

            printf(” %2d”,j+1);  

        }  

            printf(” ┃\n”);  

        if(i<N-1)  

    printf(“\t\t\t******************\n”);  

    }  

    printf(“\t\t\t******************\n”);  

    if(count==N*M)  

    {  

        printf(“尊贵的用户,您好,该停车场已满,请找其他停车场!\n”);  

    }  

    else  

    {  

        printf(“尊贵的用户,您好,已停车位:%d,可停车位%d,您可以停车!\n”,count,N*M-count);  

    }  

    system(“pause”);  

    system(“cls”);  

    return ;  

}  

  

//菜单  

void menu()             //菜单中添加显示当前时间  

{  

    time_t t=time(NULL);  

    char *time=ctime(&t);  

    printf(“\t\t\t******************\n”);  

    printf(“\t\t\t     欢迎使用智能停车场系统         \n”);  

    printf(“\t\t\t                                    \n”);  

    printf(“\t\t\t         1-停放状态查询             \n”);  

    printf(“\t\t\t         2-停车                     \n”);  

    printf(“\t\t\t         3-取车                     \n”);  

    printf(“\t\t\t         4-自助充值                 \n”);  

    printf(“\t\t\t         5-管理员管理系统           \n”);  

    printf(“\t\t\t         0-返回主菜单               \n”);  

    printf(“\t\t\t     请按相关输入对应数字           \n”);  

    printf(“\t\t\t        注:□ -空位,■ -已停          \n”);  

    printf(“\t\t\t******************\n”);   

    printf(“\t\t\t 当前时间:%s”,time);  

    原文作者:停车场模拟问题
    原文地址: https://blog.csdn.net/xulujuncsdn/article/details/53400777
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞