已在****.exe中执行断点指令(_debugbreak()一句或类&代码为-1073740940

        提前说明: 已在****.exe中执行断点指令(_debugbreak()一句或类&代码为-1073740940,这两个错误在我的代码中同时存在,但是我只改了一个点,就将两个代码同时解决,说明这两个错误可以是同时存在的。

        并且,我的这种情况并非通用解决方法,在网上找过大量资料,也没能找到通用解决方法,只是通过改bug的形式将这两个错误消除。

1.问题       

        以下是我运行程序时发生的错误:

已在****.exe中执行断点指令(_debugbreak()一句或类&代码为-1073740940_第1张图片

        当我开始调试时,发现报以下的错误: 已在****.exe中执行断点指令(_debugbreak()一句或类,在网上找了许多关于这个指令的错误,都没能找出答案。

已在****.exe中执行断点指令(_debugbreak()一句或类&代码为-1073740940_第2张图片

以下为源代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include 
#include 
#include 

#define MAX_NAME 20
#define DEFAULT_SIZE 3

typedef struct People {
    char name[MAX_NAME];
    int ID;
    int politic;
    int chinese;
    int math;
    int english;
    int total;
}people;

typedef struct {
    people* PeoInfo;
    int size;
    int capacity;
}Tablet;

enum OPTION { EXIT, ADD, DELETE, MODIFY, SHOW, SORT, SAVE };

void Add_people(Tablet* Tab);
void Load_Tablet(Tablet* Tab);
void Init_Tablet(Tablet* Tab);
void Del_people(Tablet* Tab);
void Show_numbers(Tablet* Tab);
int Find_by_name(Tablet* Tab, char name[MAX_NAME]);
void Modify_information(Tablet* Tab);
void Destroy_Tablet(Tablet* Tab);
void Save_Tablet(Tablet* Tab);
void menu();
void CheckCapacity(Tablet* Tab);
int compare_by_total(const void* p1, const void* p2) {
    return (*(people*)p2).total - (*(people*)p1).total;
}

void Sort_numbers(Tablet* Tab) {
    qsort(Tab->PeoInfo, Tab->size, sizeof(people), compare_by_total);
}

int main() {
    Tablet Tab;
    Init_Tablet(&Tab);
    int Input = 0;
    do {
        menu();
        printf("选择你要进行的操作:");
        scanf_s("%d", &Input);
        switch (Input) {
        case ADD:
            Add_people(&Tab);
            break;
        case DELETE:
            Del_people(&Tab);
            break;
        case MODIFY:
            Modify_information(&Tab);
            break;
        case SHOW:
            Show_numbers(&Tab);
            break;
        case SORT:
            Sort_numbers(&Tab);
            break;
        case SAVE:
            Save_Tablet(&Tab);
            break;
        case EXIT:
            printf("退出成功!\n");
            Destroy_Tablet(&Tab);
            break;
        default:
            printf("选择错误,请重新选择:");
            break;
        }
    } while (Input != 0);
    return 0;
}

void CheckCapacity(Tablet* Tab) {
    if (Tab->size == Tab->capacity) {
        people* ptr = realloc(Tab->PeoInfo, (Tab->capacity + 2) * sizeof(people));
        if (ptr == NULL) {
            printf("增加容量失败\n");
        }
        else {
            Tab->PeoInfo = ptr;
            Tab->capacity + 2;
            printf("增加容量成功\n");
        }
    }
}

void Save_Tablet(Tablet* Tab) {
    FILE* pf_write = fopen("Tablet.txt", "wb");
    if (pf_write == NULL) {
        printf("%s\n", strerror(errno));
        return;
    }
    else {
        int i = 0;
        for (i = 0; i < Tab->size; i++) {
            fwrite(&Tab->PeoInfo[i], sizeof(people), 1, pf_write);
        }
        fclose(pf_write);
        pf_write = NULL;
        printf("保存成功!\n");
    }
}

void menu() {
    printf("------------------------------------------\n");
    printf("-----1.add                 2.del    ------\n");
    printf("-----3.modify              4.show   ------\n");
    printf("-----5.sort                6.save   ------\n");
    printf("-----            0.exit             ------\n");
    printf("------------------------------------------\n");
}

void Add_people(Tablet* Tab) {
    CheckCapacity(Tab);
    printf("请输入名字:");
    scanf("%s", Tab->PeoInfo[Tab->size].name);
    printf("请输入ID:");
    scanf("%d", &(Tab->PeoInfo[Tab->size].ID));
    printf("请输入政治成绩:");
    scanf("%d", &(Tab->PeoInfo[Tab->size].politic));
    printf("请输入语文成绩:");
    scanf("%d", &(Tab->PeoInfo[Tab->size].chinese));
    printf("请输入数学成绩:");
    scanf("%d", &(Tab->PeoInfo[Tab->size].math));
    printf("请输入英语成绩:");
    scanf("%d", &(Tab->PeoInfo[Tab->size].english));
    
    Tab->PeoInfo[Tab->size].total = Tab->PeoInfo[Tab->size].politic +
        Tab->PeoInfo[Tab->size].chinese +
        Tab->PeoInfo[Tab->size].math +
        Tab->PeoInfo[Tab->size].english;
    Tab->size++;
    printf("增加成员成功\n");
}

void Destroy_Tablet(Tablet* Tab) {
    free(Tab->PeoInfo);
    Tab->PeoInfo = NULL;
}

void Load_Tablet(Tablet* Tab) {
    people tmp = { 0 };
    FILE* pf_raed = fopen("Tablet.txt", "rb");
    if (pf_raed == NULL) {
        printf("%s\n", strerror(errno));
        return;
    }
    while (fread(&tmp, sizeof(people), 1, pf_raed)) {
        CheckCapacity(Tab);
        Tab->PeoInfo[Tab->size] = tmp;
        Tab->size++;
    }
    fclose(pf_raed);
    pf_raed = NULL;
}

void Init_Tablet(Tablet* Tab) {
    Tab->PeoInfo = (people*)malloc(DEFAULT_SIZE * sizeof(people));
    if (Tab->PeoInfo == NULL) {
        return;
    }
    Tab->size = 0;
    Tab->capacity = DEFAULT_SIZE;
    Load_Tablet(Tab);
}

int Find_by_name(Tablet* Tab, char name[MAX_NAME]) {
    int i = 0;
    for (i = 0; i < Tab->size; i++) {
        if (0 == strcmp(name, Tab->PeoInfo[i].name)) {
            return i;
        }
    }
    return -1;
}

void Modify_information(Tablet* Tab) {
    printf("输入要被修改的人的名字:");
    char name[MAX_NAME];
    scanf("%s", name);
    int position = Find_by_name(Tab, name);
    if (position == -1) {
        printf("没有这个人的信息\n");
    }
    else {
        printf("请输入名字:");
        scanf("%s", Tab->PeoInfo[position].name);
        printf("请输入ID:");
        scanf("%d", &(Tab->PeoInfo[position].ID));
        printf("请输入政治成绩:");
        scanf("%d", &(Tab->PeoInfo[position].politic));
        printf("请输入语文:");
        scanf("%d", &(Tab->PeoInfo[position].chinese));
        printf("请输入数学:");
        scanf("%d", &(Tab->PeoInfo[position].math));
        printf("请输入英语:");
        scanf("%d", &(Tab->PeoInfo[position].english));
        Tab->PeoInfo[Tab->size].total = Tab->PeoInfo[Tab->size].politic +
            Tab->PeoInfo[Tab->size].chinese +
            Tab->PeoInfo[Tab->size].math +
            Tab->PeoInfo[Tab->size].english;
        printf("修改成员信息成功\n");
    }
}

void Del_people(Tablet* Tab) {
    printf("请输入被删除考生的名字:");
    char name[MAX_NAME];
    scanf("%s", name);
    int ret = Find_by_name(Tab, name);
    if (ret == -1) {
        printf("没有该考生信息\n");
        return;
    }
    else {
        int j = ret;
        for (j = ret; j < Tab->size - 1; j++) {
            Tab->PeoInfo[j] = Tab->PeoInfo[j + 1];
        }
        Tab->size--;
        printf("删除成功!\n");
    }
}

void Show_numbers(Tablet* Tab) {
    if (Tab->size == 0) {
        printf("没有任何考考生的成绩\n");
    }
    else {
        int i = 0;
        printf("%-20s\t%-5s\t%-5s\t%-5s\t%-5s\t%-5s\t%-5s\n", "姓名", "ID号", "政治", "语文", "数学", "英语", "总分");
        for (i = 0; i < Tab->size; i++) {
            printf("%-20s\t%-5d\t%-5d\t%-5d\t%-5d\t%-5d\t%-5d\n",
                Tab->PeoInfo[i].name,
                Tab->PeoInfo[i].ID,
                Tab->PeoInfo[i].politic,
                Tab->PeoInfo[i].chinese,
                Tab->PeoInfo[i].math,
                Tab->PeoInfo[i].english,
                Tab->PeoInfo[i].total);
        }
    }
}

2.解决问题 

        提前说明,该类问题仅限于当前我这种情况,在网上找了许多解决问题的博客,也没能找出通用的解决方法。

        报错为: 代码为-1073740940,很可能是内存出现问题,初步估计为栈溢出(根据改正确的代码推测的)。

        因为我实际上在文件中存入了十个人的信息,但是在原始的内存分配中,我只分配了3个人的内存空间,每一次增加容量都是通过realloc增加容量,一次增加两个。但是这个问题在于,我能通过文件读取将这十个人的信息读出来,但是就是不能再次将这十个人的信息存储进文件。所以我推测,很可能是初始分配的空间不足,导致在文件写入的时候出现问题。

        当我在初始内存从3修改为10之后,两个错误都解决了:

已在****.exe中执行断点指令(_debugbreak()一句或类&代码为-1073740940_第3张图片

        以下为调试结果:

已在****.exe中执行断点指令(_debugbreak()一句或类&代码为-1073740940_第4张图片

        当我再次选择6.sort时,不在报错,前面两个问题同时解决。 

        希望能对你有帮助^_^ !

你可能感兴趣的:(算法)