在输入第二个信息之后程序就显示访问位置冲突

在输入第二个信息之后程序就显示访问位置冲突


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<stdlib.h>
#include<string.h>
struct Medicine {
    char ID[20];
    char Name[10];
    float Price[20];
} medicines[80];

int num = 0;
void Copy(struct Medicine* arr, int i, int j)
{
    strcpy(arr[i].ID, arr[j].ID);
    strcpy(arr[i].Name, arr[j].Name);
    strcpy(arr[i].Price, arr[j].Price);
 
}
int Medicine_SearchByName(char name[])
{
    int i;
    for (i = 0; i < num; i++)
    {
        if (strcmp(medicines[i].Name, name) == 0)  
        {
            return i;
        }
    }
    return -1;     
}

int Medicine_SearchByIndex(char id)
{
    int i;
    for (i = 0; i < num; i++)
    {
        if (strcmp(medicines[i].ID, id) == 0)
        {
            return i;
        }
    }
    return -1;
}
void Medicine_DisplaySingle(int index)  
{
    printf("%10s%10s%10s\n", "序号","名称","价格");
    printf("-------------------------------------------------------------\n");
    printf("%10s%10s%8.2f%8.2f%8.2f%8.2f%10.2f%10.2f\n", medicines[index].ID, medicines[index].Name, medicines[index].Price);
}
void inputt()   
{
    while (1)
    {
        printf("请输入序号:");    
        scanf("%s", medicines[num].ID);
        getchar();                 
        printf("请输入名称:");
        scanf("%s", medicines[num].Name);
        getchar();
        printf("请输入价格:");
        scanf("%f", medicines[num].Price);
        getchar();
        if (Medicine_SearchByIndex(medicines[num].ID) == -1)
        {
            num++;  
        }
        else
        {
            printf("输入数据无效 !!!\n");
        }
        printf("是否继续?(y/n)");
        if (getchar() == 'n')
        {
            break;
        }
    }
}
void modify()
{
    while (1)
    {
        char id[20];
        int index;
        printf("请输入要修改的序号:");
        scanf("%s", &id);
        getchar();     
        index = Medicine_SearchByIndex(id);   
        if (index == -1)
        {
            printf("药品不存在!\n");
        }
        else
        {
            printf("你要修改的药品信息为:\n");
            Medicine_DisplaySingle(index);
            printf("请输入新值\n");
            printf("请输入序号;");
            scanf("%s", medicines[index].ID);
            getchar();
            printf("请输入名称;");
            scanf("%s", medicines[index].Name);
            getchar();
            printf("请输入价格:");
            scanf("%f", medicines[index].Price);
            getchar();
        }
        printf("是否继续?(y/n)");
        if (getchar() == 'n')
        {
            break;
        }
    }
}
void deletee()
{
    int i;
    while (1)
    {
        char id[20];
        int index;
        printf("请输入要删除的序号:");
        scanf("%s", &id);
        getchar();
        index = Medicine_SearchByIndex(id);  
        if (index == -1)
        {
            printf("药品不存在!\n");
        }
        else
        {
            printf("你要删除的药品信息为:\n");
            Medicine_DisplaySingle(index);
            printf("是否真的要删除?(y/n)");
            if (getchar() == 'y')
            {
                for (i = index; i < num - 1; i++)
                {
                    Copy(medicines, i, i + 1);
                    medicines[i] = medicines[i + 1];
                }
                num--;
            }
            getchar();
        }
        printf("是否继续?(y/n)");
        if (getchar() == 'n')
        {
            break;
        }
    }
}
void display()
{
    int a;
    printf("%10s%10s%10s\n", "序号", "名称", "价格");
    printf("-------------------------------------------------------------\n");
    for (a = 0; a < num; a++)
    {
        printf("%10s%10s%10.2f\n", medicines[a].ID, medicines[a].Name,
            medicines[a].Price);
    }
}
void insert()
{
    int a, b, c;
    printf("请输入你要插入的位置");
    scanf("%d", &a);
    if (a > num) {
        printf("输入的位置有误,请重新输入,当前共%d条数据\n", num);
        scanf("%d", &a);
    }
    for (b = num - 1; b >= a - 1; b--)
    {
        //strcpy(medicines[b+1].ID,medicines[b].ID);
        //strcpy(meicines[b+1].Name,medicines[b].Name);
        //medicines[b+1].Price=medicines[b].Price;
        Copy(medicines, b + 1, b);
    }
    num++;  
    printf("请输入序号:"); 
    scanf("%s", medicines[a - 1].ID);
    getchar();
    printf("请输入名称:");
    scanf("%s", medicines[a - 1].Name);
    getchar();
    printf("请输入价格:");
    scanf("%f", medicines[a - 1].Price);
    getchar();
}
void search()
{
    while (1)
    {
        char name[20];
        int index;
        printf("请输入要查询的名称:");
        scanf("%s", &name);
        getchar();
        index = Medicine_SearchByName(name);  
        if (index == -1)
        {
            printf("不存在!\n");
        }
        else
        {
            printf("你要查询的药品信息为:\n");
            Medicine_DisplaySingle(index);
        }
        printf("是否继续?(y/n)");
        if (getchar() == 'n')
        {
            break;
        }
    }
}

void Save()
{
    FILE* fp = fopen("temp.txt", "w+");
    fprintf(fp, "%d\n", num);
    for (int i = 0; i < num; i++)
    {
        fprintf(fp, "%s %s %f\n", medicines[i].ID,medicines[i].Name, medicines[i].Price);
    }
    fclose(fp);
}
void Load()
{
    FILE* fp = fopen("temp.txt", "r");
    fscanf(fp, "%d", &num);
    for (int i = 0; i < num; i++)
    {
        fscanf(fp, "%s %s %f\n", medicines[i].ID, medicines[i].Name, medicines[i].Price);
    }
    fclose(fp);
}
/*主程序*/
int main() {
    int i;
    while (1) {
        Load();
        printf("\t\t\t\t\t-------- 药品信息管理系统-------\n\n\n\n");  
        printf("\t\t\t\t\t1. 增加药品信息\n\n");
        printf("\t\t\t\t\t2. 修改药品信息\n\n");
        printf("\t\t\t\t\t3. 删除药品信息\n\n");
        printf("\t\t\t\t\t4. 插入药品信息\n\n");
        printf("\t\t\t\t\t5. 显示所有药品信息\n\n");
        printf("\t\t\t\t\t6. 查询药品信息\n\n");
        printf("\t\t\t\t\t0. 退出\n\n\n");
        printf("请选择(0-6):");
        scanf("%d", &i);
        switch (i) {
        case 1:inputt(); break;
        case 2:modify(); break;
        case 3:deletee(); break;
        case 4:insert(); break;
        case 5:display(); break;
        case 6:search(); break;
        case 0:exit(0); 
        default:;
        }
        Save();
    }
    return 0;
}

代码修改完善如下,改动处见注释,供参考:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<stdlib.h>
#include<string.h>
struct Medicine {
    char  ID[20];
    char  Name[10];
    float Price;  //float Price[20];  // 修改
} medicines[80];

int num = 0;
void Copy(struct Medicine* arr, int i, int j) // 修改 这个函数多余无用,可以删除
{
    strcpy(arr[i].ID, arr[j].ID);
    strcpy(arr[i].Name, arr[j].Name);
    arr[i].Price = arr[j].Price;        // 修改
    //strcpy(arr[i].Price, arr[j].Price);  修改
}
int Medicine_SearchByName(char name[])
{
    int i;
    for (i = 0; i < num; i++)
    {
        if (strcmp(medicines[i].Name, name) == 0)
        {
            return i;
        }
    }
    return -1;
}

int Medicine_SearchByIndex(char* id)
//int Medicine_SearchByIndex(char id) 修改
{
    int i;
    for (i = 0; i < num; i++)
    {
        if (strcmp(medicines[i].ID, id) == 0)
        {
            return i;
        }
    }
    return -1;
}
void Medicine_DisplaySingle(int index)
{
    printf("%10s%10s%10s\n", "序号","名称","价格");
    printf("-------------------------------------------------------------\n");
    // printf("%10s%10s%8.2f%8.2f%8.2f%8.2f%10.2f%10.2f\n", medicines[index].ID, // 修改
    printf("%10s%10s%8.2f\n", medicines[index].ID,                               // 修改
                               medicines[index].Name, medicines[index].Price);
}
void inputt()
{
    while (1)
    {
        printf("请输入序号:");    
        scanf("%s", medicines[num].ID);
        getchar();                 
        printf("请输入名称:");
        scanf("%s", medicines[num].Name);
        getchar();
        printf("请输入价格:");
        scanf("%f", &medicines[num].Price); // 修改
        //scanf("%f", medicines[num].Price);
        getchar();
        if (Medicine_SearchByIndex(medicines[num].ID) == -1)
        {
            num++;  
        }
        else
        {
            printf("输入数据无效 !!!\n");
        }
        printf("是否继续?(y/n)");
        if (getchar() == 'n')
        {
            break;
        }
    }
}
void modify()
{
    while (1)
    {
        char id[20];
        int index;
        printf("请输入要修改的序号:");
        scanf("%s", &id);
        getchar();     
        index = Medicine_SearchByIndex(id);   
        if (index == -1)
        {
            printf("药品不存在!\n");
        }
        else
        {
            printf("你要修改的药品信息为:\n");
            Medicine_DisplaySingle(index);
            printf("请输入新值\n");
            printf("请输入序号;");
            scanf("%s", medicines[index].ID);
            getchar();
            printf("请输入名称;");
            scanf("%s", medicines[index].Name);
            getchar();
            printf("请输入价格:");
            scanf("%f", &medicines[index].Price); // 修改
            //scanf("%f", medicines[index].Price);
            getchar();
        }
        printf("是否继续?(y/n)");
        if (getchar() == 'n')
        {
            break;
        }
    }
}
void deletee()
{
    int i;
    while (1)
    {
        char id[20];
        int index;
        printf("请输入要删除的序号:");
        scanf("%s", &id);
        getchar();
        index = Medicine_SearchByIndex(id);  
        if (index == -1)
        {
            printf("药品不存在!\n");
        }
        else
        {
            printf("你要删除的药品信息为:\n");
            Medicine_DisplaySingle(index);
            printf("是否真的要删除?(y/n)");
            if (getchar() == 'y')
            {
                for (i = index; i < num - 1; i++)
                {
                    // Copy(medicines, i, i + 1);  修改,这句删除,无用
                    medicines[i] = medicines[i + 1];
                }
                num--;
            }
            getchar();
        }
        printf("是否继续?(y/n)");
        if (getchar() == 'n')
        {
            break;
        }
    }
}
void display()
{
    int a;
    printf("%10s%10s%10s\n", "序号", "名称", "价格");
    printf("-------------------------------------------------------------\n");
    for (a = 0; a < num; a++)
    {
        printf("%10s%10s%10.2f\n", medicines[a].ID, medicines[a].Name,
            medicines[a].Price);
    }
}
void insert()
{
    int a, b, c;
    do {                                 // 修改
        printf("输入你要插入的位置");    // 修改
        scanf("%d", &a);
        if (a > num || a < 1)            // 修改
            printf("输入的位置有误,当前共%d条数据,请重新", num);
    }while (a < 1 || a > num);            // 修改
    for (b = num - 1; b >= a - 1; b--)
    {
        medicines[b + 1] = medicines[b];            // 修改
        //strcpy(medicines[b+1].ID,medicines[b].ID);
        //strcpy(meicines[b+1].Name,medicines[b].Name);
        //medicines[b+1].Price=medicines[b].Price;
        //Copy(medicines, b + 1, b);
    }
    num++;  
    printf("请输入序号:");
    scanf("%s", medicines[a - 1].ID);
    getchar();
    printf("请输入名称:");
    scanf("%s", medicines[a - 1].Name);
    getchar();
    printf("请输入价格:");
    scanf("%f", &medicines[a - 1].Price);  // 修改
    //scanf("%f", medicines[a - 1].Price);
    getchar();
}
void search()
{
    while (1)
    {
        char name[20];
        int index;
        printf("请输入要查询的名称:");
        scanf("%s", &name);
        getchar();
        index = Medicine_SearchByName(name);
        if (index == -1)
        {
            printf("不存在!\n");
        }
        else
        {
            printf("你要查询的药品信息为:\n");
            Medicine_DisplaySingle(index);
        }
        printf("是否继续?(y/n)");
        if (getchar() == 'n')
        {
            break;
        }
    }
}
 
void Save()
{
    FILE* fp = fopen("temp.txt", "w+");
    fprintf(fp, "%d\n", num);
    for (int i = 0; i < num; i++)
    {
        fprintf(fp, "%s %s %f\n", medicines[i].ID,medicines[i].Name, medicines[i].Price);
    }
    fclose(fp);
}
void Load()
{
    FILE* fp = fopen("temp.txt", "r");
    if (!fp) {                        // 修改
        printf("File open fail!\n");  // 修改
        return;                       // 修改
    }
    fscanf(fp, "%d", &num);
    for (int i = 0; i < num; i++)
    {
        fscanf(fp, "%s %s %f\n", medicines[i].ID, medicines[i].Name, &medicines[i].Price); // 修改
        //fscanf(fp, "%s %s %f\n", medicines[i].ID, medicines[i].Name, medicines[i].Price);
    }
    fclose(fp);
}
/*主程序*/
int main() {
    int i;
    Load(); // 修改
    while (1) {
        //Load();  修改
        printf("\t\t\t\t\t-------- 药品信息管理系统-------\n\n\n\n");  
        printf("\t\t\t\t\t1. 增加药品信息\n\n");
        printf("\t\t\t\t\t2. 修改药品信息\n\n");
        printf("\t\t\t\t\t3. 删除药品信息\n\n");
        printf("\t\t\t\t\t4. 插入药品信息\n\n");
        printf("\t\t\t\t\t5. 显示所有药品信息\n\n");
        printf("\t\t\t\t\t6. 查询药品信息\n\n");
        printf("\t\t\t\t\t0. 退出\n\n\n");
        printf("请选择(0-6):");
        scanf("%d", &i);
        switch (i) {
        case 1:inputt(); break;
        case 2:modify(); break;
        case 3:deletee(); break;
        case 4:insert(); break;
        case 5:display(); break;
        case 6:search(); break;
        case 0:Save();  exit(0);// 修改
        default:;
        }
        //Save();  修改
    }
    return 0;
}

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

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