提前说明: 已在****.exe中执行断点指令(_debugbreak()一句或类&代码为-1073740940,这两个错误在我的代码中同时存在,但是我只改了一个点,就将两个代码同时解决,说明这两个错误可以是同时存在的。
并且,我的这种情况并非通用解决方法,在网上找过大量资料,也没能找到通用解决方法,只是通过改bug的形式将这两个错误消除。
以下是我运行程序时发生的错误:
当我开始调试时,发现报以下的错误: 已在****.exe中执行断点指令(_debugbreak()一句或类,在网上找了许多关于这个指令的错误,都没能找出答案。
以下为源代码:
#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);
}
}
}
提前说明,该类问题仅限于当前我这种情况,在网上找了许多解决问题的博客,也没能找出通用的解决方法。
报错为: 代码为-1073740940,很可能是内存出现问题,初步估计为栈溢出(根据改正确的代码推测的)。
因为我实际上在文件中存入了十个人的信息,但是在原始的内存分配中,我只分配了3个人的内存空间,每一次增加容量都是通过realloc增加容量,一次增加两个。但是这个问题在于,我能通过文件读取将这十个人的信息读出来,但是就是不能再次将这十个人的信息存储进文件。所以我推测,很可能是初始分配的空间不足,导致在文件写入的时候出现问题。
当我在初始内存从3修改为10之后,两个错误都解决了:
以下为调试结果:
当我再次选择6.sort时,不在报错,前面两个问题同时解决。
希望能对你有帮助^_^ !