简单的销售信息管理,在运行中显示销售信息时,为什么显示的销售人编号变为问号


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

//销售信息
struct Sales{
    int year;                //年 
    int month;                //月 
    int day;                //日 
    char name[5];            //销售人姓名 
    char xnum[9];            //销售人编号 
    float sale;                //销售额 
    
}; 

//销售信息列表
struct Slist{
    struct Sales* data;
    int ys;//列表有效元素 
    int rs;//列表当前最大容量 

} ;

//初始化销售信息
void cs_xs(struct Slist* xs);
//检查销售信息 
void check_xs(struct Slist* xs);
//添加销售信息 
void tj_xs(struct Slist* xs);
//删除销售信息 
void sc_xs(struct Slist* xs); 
//修改销售信息
void xg_xs(struct Slist* xs);
//查找销售信息
void cz_xs(const struct Slist* xs); 
//保存销售信息
void save_xs(struct Slist* xs); 
//加载销售信息 
void jz_xs(struct Slist* xs); 
//显示全部销售信息
void show_xs(struct Slist* xs);

void menu()
{
    printf("****************************************\n");
    printf("------------1.添加销售信息--------------\n");
    printf("------------2.删除销售信息--------------\n");
    printf("------------3.修改销售信息--------------\n");
    printf("------------4.查找销售信息--------------\n");
    printf("------------5.显示销售信息--------------\n");
    printf("------------6.保存销售信息--------------\n");
    printf("------------0.返回上一界面--------------\n");
    printf("****************************************\n");

}

int main()
{

    int input = 0;
    //创建一个销售列表 
    struct Slist list;
    //初始化销售列表 
    cs_xs(&list);
    do
    {
        menu();
        printf("请选择:>");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            tj_xs(&list);
            break;
        case 2:
            sc_xs(&list);
            break;
        case 3:
            xg_xs(&list);
            break; 
        case 4:
            cz_xs(&list);
            break;
        case 5:
            show_xs(&list);
            break;
        case 6:
            //保存信息
            save_xs(&list);
            break;
        default:
            printf("选择错误\n");
            break;
        }
    } while (input);
    return 0;
}

//初始化销售信息 
void cs_xs(struct Slist* xs)
{
    xs->ys = 0;
    //最多可以放3条销售信息,空间不够,可以增容
    xs->data = (struct Slist*)malloc(3 * sizeof(struct Slist));
    xs->rs = 3;

    //加载文件信息到通讯录中
    jz_xs(xs);
}

//加载销售信息 
void jz_xs(struct Slist* xs)
{
    //打开文件
    FILE* pf = fopen("sale.txt", "rb");
    if (NULL == pf)
    {
        perror("LoadSale::fopen");//打印出错误信息
        return;
    }
    //读文件
    struct Sales temp = { 0 };

    while (fread(&temp, sizeof(struct Sales), 1, pf))
    {
        //空间不够的话,得增加空间
        check_xs(xs);

        xs->data[xs->ys] = temp;
        xs->ys++;
    }

    //关闭文件
    fclose(pf);
    pf = NULL;
}

//添加销售信息 
void tj_xs(struct Slist* xs)
{
    
    check_xs(xs);
    //录入添加的销售信息
    do 
    {
        printf("请输入销售人编号:>");
        scanf("%s", xs->data[xs->ys].xnum);
    }
    while (strlen(xs->data[xs->ys].xnum)!=8);
    
    printf("请输入销售人姓名:>");
    scanf("%s", xs->data[xs->ys].name);
    
    do
    {
        printf("请输入销售日期:>");
        scanf("%d%d%d", &xs->data[xs->ys].year,&xs->data[xs->ys].month,&xs->data[xs->ys].day);
    }
    while(xs->data[xs->ys].month<-0||xs->data[xs->ys].month>=12||xs->data[xs->ys].day<=0||xs->data[xs->ys].day>=31);
    
    printf("请输入销售金额:>");
    scanf("%f", &xs->data[xs->ys].sale);
    
    xs->ys++;
    
    printf("添加成功\n"); 
}

//检查销售信息 
void check_xs(struct Slist* xs)
{
    if (xs->ys == xs->rs)
    {
        //增加容量
        struct Sales* sa = (struct Sales*)realloc(xs->data, (xs->rs + 2)*sizeof(struct Sales));
        if (sa != NULL)
        {
            xs->data = sa;
            xs->rs += 2;

            printf("增容成功\n");
        }
        else
        {
            perror("增容失败");
            exit(1);
        }
    }    
}

//显示销售列表全部信息
void show_xs(struct Slist* xs)
{
    int i = 0;
    printf("%15s\t%15s\t%10s\t%15s\t%10s\t%10s\n\n", "xnum", "name", "year", "month", "day","sale");
    for ( i = 0; i < xs->ys; i++)
    {
        printf("%15s\t%15s\t%10d\t%15d\t%10d\t%10.2f\n",xs->data[i].xnum, xs->data[i].name, xs->data[i].year,xs->data[i].month,xs->data[i].day,xs->data[i].sale);
    }
}

//按收银员编号寻找 
int FindSalesByXnum(const struct Slist* xs,char xnum[])
{
    int i = 0;
    for ( i = 0; i < xs->ys; i++)
    {
        if (strcmp(xs->data[i].xnum, xnum) == 0)
        {
            return i;
        }
    }
    return -1;
}

//删除销售信息 
void sc_xs(struct Slist* xs)
{
    if (xs->ys == 0)
    {
        printf("销售信息为空,无法删除\n");
        return;
    }
    char xnum[9] = {0};
    printf("请输入要删除销售信息的销售人编号:>");
    scanf("%s", xnum);
    //查找
    int cz = FindSalesByXnum(xs, xnum);
    if (cz == -1)
    {
        printf("指定的销售人编号不存在\n");
    }
    else
    {
        //删除
        int j = 0;
        for ( j = cz; j < xs->ys - 1; j++)   //把要删除元素的所有后面的元素往前移动1
        {
            xs->data[j] = xs->data[j + 1];
        }
        xs->ys--;
        printf("删除成功\n");

    }
}

//查找销售信息 
void cz_xs(const struct Slist* xs)
{
    char xnum[9] = { 0 };
    printf("输入要查找销售信息销售人的编号");
    scanf("%s", xnum);
    int cz = FindSalesByXnum(xs, xnum);
    if (-1 == cz)
    {
        printf("查无此销售信息\n");
    }
    else
    {
        printf("%15s\t%15s\t%10s\t%15s\t%10s\t%10s\n\n", "xnum", "name","year","month","day", "sale");
        for (cz = 0; cz < xs->ys; cz++)
        {
            printf("%15s\t%15s\t%10d\t%15d\t%10d\t%10.2f\n\n", xs->data[cz].xnum, xs->data[cz].name, xs->data[cz].year,xs->data[cz].month,xs->data[cz].day,xs->data[cz].sale);

        }
    }
}

//修改销售信息 
void xg_xs(struct Slist* xs)
{
    char xnum[9] = { 0 };
    printf("输入要修改销售信息的销售人编号");
    scanf("%s", xnum);
    int cz = FindSalesByXnum(xs, xnum);
    if (-1 == cz)
    {
        printf("要修改的销售信息不存在\n");
    }
    else
    {
        printf("请输入新的收银员编号:>");
        scanf("%s", xs->data[cz].xnum);
        
        printf("请输入收银员姓名:>");
        scanf("%s", xs->data[cz].name);
        
        printf("请输入销售日期:>");
        scanf("%d%d%d", &xs->data[xs->ys].year,&xs->data[xs->ys].month,&xs->data[xs->ys].day);
    
        printf("请输入销售金额:>");
        scanf("%f", &xs->data[xs->ys].sale);    
    }
}

//保存销售信息 
void save_xs(struct Slist* xs)
{
    //打开文件
    FILE* pf = fopen("sale.txt", "wb");//以二进制的形式写
    if (pf == NULL)
    {
        perror("SaveSale::fopen");
        return;
    }
    //写数据
    for (int i = 0; i < xs->ys; i++)
    {
        
        fwrite(xs->data + i, sizeof(struct Sales), 1, pf);
    }
    //关闭文件
    fclose(pf);
    pf = NULL;
}




img

img

img

因为某种原因,权限不够

第11行 12行修改如下:

//销售信息
struct Sales {
    int year;           //年 
    int month;          //月 
    int day;            //日 
    char name[16];       //销售人姓名 char name[5]; 修改
    char xnum[10];       //销售人编号  char xnum[9];修改
    float sale;         //销售额 

};

第105行修改如下:

//初始化销售信息 
void cs_xs(struct Slist* xs)
{
    xs->ys = 0;
    //最多可以放3条销售信息,空间不够,可以增容
    xs->data = (struct Sales*)malloc(3 * sizeof(struct Sales)); //修改
    //xs->data = (struct Slist*)malloc(3 * sizeof(struct Slist));
    xs->rs = 3;
    //加载文件信息到通讯录中
    jz_xs(xs);
}