sciverGreen 2022-12-04 23:34 采纳率: 100%
浏览 188
已结题

求助!求助!被困扰一下午了

######今天写课设的时候突然遇到的问题,本来一切都正常,但是不知道为什么第3个功能就不能输入信息了,还显示什么堆损坏,之后用第3个功能输入信息后,就会直接退出程序,之后第一个功能也出问题了,还跳出来一个叫stdio.h的文件,找了好久找不到问题,求大佬解答!
我们这个学期学的数据结构,但是c++不是太了解,许多地方还是用c语音的方式写的。
这是代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_NAME 20
#define MAX_NUMBER 20
#define MAX_SEX 5
#define MAXSIZE 100
typedef struct Contact {
    char name[MAX_NAME];
    int age;
    char phone[MAX_NUMBER];
    char sex[MAX_SEX];
}Contact;//定义联系人数据
typedef struct Contacts {
    Contact phonebook[MAXSIZE];//联系人数组
    int length;//已记录的联系人数量
}Contacts;//定义通讯录
void Clean(void) {
    getchar();
    system("cls");

}
void InitContacts(Contacts*& C) {
    C = (Contacts*)malloc(sizeof(Contacts));//给通讯录分配动态内存
    C->length = 0;
};//初始化通讯录//初始化
void CreateContacts(Contacts*& C) {
    InitContacts(C);
    C = (Contacts*)malloc(sizeof(Contact));//给通讯录分配动态内存
    printf("请输入第一个联系人以建立通讯录。\n");
    printf("请输入第一个联系人的姓名:"); scanf_s("%s", C->phonebook[0].name, 20); getchar();

    printf("请输入第一个联系人的年龄:"); scanf_s("%d", &C->phonebook[0].age); getchar();

    printf("请输入第一个联系人的电话:"); scanf_s("%s", C->phonebook[0].phone, 12); getchar();
    printf("请输入第一个联系人的性别:"); scanf_s("%s", C->phonebook[0].sex, 5); getchar();
    C->length = 1;
    printf("\n");
    printf("你输入的第一个联系人信息为:\n");
    printf("姓名:%s\n", C->phonebook[0].name);
    printf("性别:%s\n", C->phonebook[0].sex);
    printf("年龄:%d\n", C->phonebook[0].age);
    printf("电话号码:%s\n", C->phonebook[0].phone);
    printf("通讯录创建成功;\n");
}
void Findbyname(Contacts*& C) {
    char name[MAX_NAME];
    int i;
    int m = 0;
    printf("请输入联系人姓名:");
    scanf_s("%s", name, 20);
    getchar();
    for (i = 0; i < C->length; i++) {
        if (strcmp(name, C->phonebook[i].name) == 0) {
            printf("该联系人的基本信息为:\n");
            printf("姓名:%s\n", C->phonebook[i].name);
            printf("性别:%s\n", C->phonebook[i].sex);
            printf("年龄:%d\n", C->phonebook[i].age);
            printf("电话号码:%s\n", C->phonebook[i].phone);
            getchar();
            m = 1;
            break;
        }
    }
    if (m == 0) {
        printf("你要找的联系人不存在\n");
        Clean();
    }
}
void Findbyphone(Contacts*& C) {
    char phone[MAX_NUMBER];
    int i;
    int m = 0;
    printf("请输入联系人电话:");
    scanf_s("%s", phone, 20);
    getchar();
    for (i = 0; i < C->length; i++) {
        if (strcmp(phone, C->phonebook[i].phone) == 0) {
            printf("该联系人的基本信息为:\n");
            printf("姓名:%s\n", C->phonebook[i].name);
            printf("性别:%s\n", C->phonebook[i].sex);
            printf("年龄:%d\n", C->phonebook[i].age);
            printf("电话号码:%s\n", C->phonebook[i].phone);
            getchar();
            m = 1;
            break;
        }
    }
    if (m == 0) {
        printf("你要找的联系人不存在\n");
        Clean();
    }
}
void FindContact(Contacts*& C) {
    system("cls");
    int n;
    printf("输入你想要的查询方法:\n");
    printf("------------------------\n");
    printf("------1.按名字查询-------\n");
    printf("------2.按电话查询-------\n");
    printf("------------------------\n");
    scanf_s("%d", &n);
    switch (n)
    {
    case 1:Findbyname(C); break;
    case 2:Findbyphone(C); break;
    }
}//查找联系人,两种不同方法,按名字和电话        

int AddContact(Contacts*& C) {
    int i;
    int m = 0;
    if (C->length == MAXSIZE)
        printf("联系人已满,无法继续添加。");
    else
    {
        printf("请输入该联系人的电话:"); scanf_s("%s", C->phonebook[C->length].phone, 12); getchar();

        for (i = 0; i < C->length; i++) {//判断电话号码是否已经存在
            if (strcmp(C->phonebook[C->length].phone, C->phonebook[i].phone) == 0) {
                printf("该联系人已存在,请重新输入。");
                C->phonebook[C->length].phone[MAX_NUMBER] = { '\0' };
                getchar();
                m = 1;
                break;
            }
        }
        if (m == 1) {
            return 0;
        }
        else {

            printf("请输入该联系人的姓名:"); scanf_s("%s", C->phonebook[C->length].name, 20); getchar();

            printf("请输入该联系人的年龄:"); scanf_s("%d", &C->phonebook[C->length].age); getchar();

            printf("请输入该联系人的性别:"); scanf_s("%s", C->phonebook[C->length].sex, 5); getchar();
            printf("该联系人添加成功\n");
            C->length++;
        }
    }
}//添加联系人
void Deletebyphone(Contacts*& C) {
    int i, j;
    int p = 0;
    char phone[MAX_NUMBER] = { '\0' };
    printf("请输入你要删除的联系人的电话号码:\n");
    scanf_s("%s", phone, 12); getchar();
    for (i = 0; i < C->length; i++) {
        if (strcmp(phone, C->phonebook[i].phone) == 0) {
            printf("该联系人的基本信息为:\n");
            break;
        }
        else {
            printf("未找到该联系人相关信息。\n");
            getchar(); break;
        }
    }
}//删除联系人
void Display(Contacts*& C) {
    int i;
    printf("通讯录中共%d人\n", C->length);
    printf("通讯录中的联系人为:\n");
    for (i = 0; i < C->length; i++) {
        printf("第%d位联系人的基本信息:\n", i + 1);
        printf("姓名:%s\n", C->phonebook[i].name);
        printf("性别:%s\n", C->phonebook[i].sex);
        printf("年龄:%d\n", C->phonebook[i].age);
        printf("电话号码:%s\n", C->phonebook[i].phone);
        printf("\n");
    }
    getchar();
}
void Distroy(Contacts*& C) {
    free(C);
    exit(0);
}
void meun(Contacts*& C) {
    while (true) {
        int k = 0;
        printf("---------------------------------\n");
        printf("-----1.创建通讯录。---------------\n");
        printf("-----2.查询联系人-----------------\n");
        printf("-----3.添加联系人-----------------\n");
        printf("-----4.删除联系人-----------------\n");
        printf("-----5.展示通讯录所有信息----------\n");
        printf("-----6.退出----------------------\n");
        printf("---------------------------------\n");
        scanf_s("%d", &k);
        switch (k)
        {
        case 1:CreateContacts(C); Clean(); break;
        case 2:FindContact(C); Clean(); break;
        case 3:AddContact(C); Clean(); break;
        case 4:Deletebyphone(C); Clean(); break;
        case 5:Display(C); Clean(); break;
        case 6:Distroy(C); break;
        }
    }
}
int main(void) {
    Contacts* c;
    meun(c);
    return 0;
}

更新后的完整代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_NAME 20
#define MAX_NUMBER 20
#define MAX_SEX 5
#define MAXSIZE 100
typedef struct Contact {
    char name[MAX_NAME];
    int age;
    char phone[MAX_NUMBER];
    char sex[MAX_SEX];
}Contact;//定义联系人数据
typedef struct Contacts {
    Contact phonebook[MAXSIZE];//联系人数组
    int length;//已记录的联系人数量
}Contacts;//定义通讯录
void Clean(void) {
    getchar();
    system("cls");
}
void InitContacts(Contacts*& C) {
    C = (Contacts*)malloc(sizeof(Contacts));//给通讯录分配动态内存
    C->length = 0;
};//初始化通讯录//初始化
void CreateContacts(Contacts*& C) {
    InitContacts(C);
    C = (Contacts*)malloc(sizeof(Contact));//给通讯录分配动态内存
    printf("请输入第一个联系人以建立通讯录。\n");
    printf("请输入第一个联系人的姓名:"); scanf_s("%s", C->phonebook[0].name, 20); getchar();
    printf("请输入第一个联系人的年龄:"); scanf_s("%d", &C->phonebook[0].age); getchar();
    printf("请输入第一个联系人的电话:"); scanf_s("%s", C->phonebook[0].phone, 12); getchar();
    printf("请输入第一个联系人的性别:"); scanf_s("%s", C->phonebook[0].sex, 5); getchar();
    C->length = 1;
    printf("\n");
    printf("你输入的第一个联系人信息为:\n");
    printf("姓名:%s\n", C->phonebook[0].name);
    printf("性别:%s\n", C->phonebook[0].sex);
    printf("年龄:%d\n", C->phonebook[0].age);
    printf("电话号码:%s\n", C->phonebook[0].phone);
    printf("通讯录创建成功;\n");
}
void Findbyname(Contacts*& C) {
    char name[MAX_NAME];
    int i;
    int m = 0;
    printf("请输入联系人姓名:");
    scanf_s("%s", name, 20);
    getchar();
    for (i = 0; i < C->length; i++) {
        if (strcmp(name, C->phonebook[i].name) == 0) {
            printf("该联系人的基本信息为:\n");
            printf("姓名:%s\n", C->phonebook[i].name);
            printf("性别:%s\n", C->phonebook[i].sex);
            printf("年龄:%d\n", C->phonebook[i].age);
            printf("电话号码:%s\n", C->phonebook[i].phone);
            getchar();
            m = 1;
            break;
        }
    }
    if (m == 0) {
        printf("你要找的联系人不存在\n");
        Clean();
    }
}
void Findbyphone(Contacts*& C) {
    char phone[MAX_NUMBER];
    int i;
    int m = 0;
    printf("请输入联系人电话:");
    scanf_s("%s", phone, 20);
    getchar();
    for (i = 0; i < C->length; i++) {
        if (strcmp(phone, C->phonebook[i].phone) == 0) {
            printf("该联系人的基本信息为:\n");
            printf("姓名:%s\n", C->phonebook[i].name);
            printf("性别:%s\n", C->phonebook[i].sex);
            printf("年龄:%d\n", C->phonebook[i].age);
            printf("电话号码:%s\n", C->phonebook[i].phone);
            getchar();
            m = 1;
            break;
        }
    }
    if (m == 0) {
        printf("你要找的联系人不存在\n");
        Clean();
    }
}
void FindContact(Contacts*& C) {
    system("cls");
    int n;
    printf("输入你想要的查询方法:\n");
    printf("------------------------\n");
    printf("------1.按名字查询-------\n");
    printf("------2.按电话查询-------\n");
    printf("------------------------\n");
    scanf_s("%d", &n);
    switch (n)
    {
    case 1:Findbyname(C); break;
    case 2:Findbyphone(C); break;
    }
}//查找联系人,两种不同方法,按名字和电话        
int AddContact(Contacts*& C) {
    int i;
    int m = 0;
    if (C->length == MAXSIZE)
        printf("联系人已满,无法继续添加。");
    else
    {
        printf("请输入该联系人的电话:"); scanf_s("%s", C->phonebook[C->length].phone, 12); getchar();
        for (i = 0; i < C->length; i++) {//判断电话号码是否已经存在
            if (strcmp(C->phonebook[C->length].phone, C->phonebook[i].phone) == 0) {
                printf("该联系人已存在,请重新输入。");
                C->phonebook[C->length].phone[MAX_NUMBER - 1] = 0;
                getchar();
                m = 1;
                break;
            }
        }
        if (m == 1) {
            AddContact(C);
        }
        else {
            printf("请输入该联系人的姓名:"); scanf_s("%s", C->phonebook[C->length].name, 20); getchar();
            printf("请输入该联系人的年龄:"); scanf_s("%d", &C->phonebook[C->length].age); getchar();
            printf("请输入该联系人的性别:"); scanf_s("%s", C->phonebook[C->length].sex, 5); getchar();
            printf("该联系人添加成功\n");
            C->length++;
        }
    }
    return 1;
}//添加联系人
void Deletebyphone(Contacts*& C) {
    int i;
    int p = 0;
    char phone[MAX_NUMBER] = { '\0' };
    printf("请输入你要删除的联系人的电话号码:\n");
    scanf_s("%s", phone, 12); getchar();
    for (i = 0; i < C->length; i++) {
        if (strcmp(phone, C->phonebook[i].phone) == 0) {
            printf("该联系人的基本信息为:\n");
            break;
        }
        else {
            printf("未找到该联系人相关信息。\n");
            getchar(); break;
        }
    }
}//删除联系人
void Display(Contacts*& C) {
    int i;
    printf("通讯录中共%d人\n", C->length);
    printf("通讯录中的联系人为:\n");
    for (i = 0; i < C->length; i++) {
        printf("第%d位联系人的基本信息:\n", i + 1);
        printf("姓名:%s\n", C->phonebook[i].name);
        printf("性别:%s\n", C->phonebook[i].sex);
        printf("年龄:%d\n", C->phonebook[i].age);
        printf("电话号码:%s\n", C->phonebook[i].phone);
        printf("\n");
    }
    getchar();
}
void Distroy(Contacts*& C) {
    free(C);
    exit(0);
}
void meun(Contacts*& C) {
    while (true) {
        int k = 0;
        printf("---------------------------------\n");
        printf("-----1.创建通讯录。---------------\n");
        printf("-----2.查询联系人-----------------\n");
        printf("-----3.添加联系人-----------------\n");
        printf("-----4.删除联系人-----------------\n");
        printf("-----5.展示通讯录所有信息----------\n");
        printf("-----6.退出----------------------\n");
        printf("---------------------------------\n");
        scanf_s("%d", &k);
        switch (k)
        {
        case 1:CreateContacts(C); Clean(); break;
        case 2:FindContact(C); Clean(); break;
        case 3:AddContact(C); Clean(); break;
        case 4:Deletebyphone(C); Clean(); break;
        case 5:Display(C); Clean(); break;
        case 6:Distroy(C); break;
        }
    }
}
int main(void) {
    Contacts c;
    c.length = 0;
    Contacts* p = &c;
    meun(p);
    return 0;
}

  • 写回答

3条回答 默认 最新

  • 快乐鹦鹉 2022-12-05 08:26
    关注

    C->phonebook[C->length].phone[MAX_NUMBER] = {'\0'};越界了啊。
    main中C也没有分配空间,修改如下:

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define MAX_NAME 20
    #define MAX_NUMBER 20
    #define MAX_SEX 5
    #define MAXSIZE 100
    typedef struct Contact {
        char name[MAX_NAME];
        int age;
        char phone[MAX_NUMBER];
        char sex[MAX_SEX];
    }Contact;//定义联系人数据
    typedef struct Contacts {
        Contact phonebook[MAXSIZE];//联系人数组
        int length;//已记录的联系人数量
    }Contacts;//定义通讯录
    void Clean(void) {
        getchar();
        system("cls");
    }
    void InitContacts(Contacts*& C) {
        C = (Contacts*)malloc(sizeof(Contacts));//给通讯录分配动态内存
        C->length = 0;
    };//初始化通讯录//初始化
    void CreateContacts(Contacts*& C) {
        InitContacts(C);
        C = (Contacts*)malloc(sizeof(Contact));//给通讯录分配动态内存
        printf("请输入第一个联系人以建立通讯录。\n");
        printf("请输入第一个联系人的姓名:"); scanf_s("%s", C->phonebook[0].name, 20); getchar();
        printf("请输入第一个联系人的年龄:"); scanf_s("%d", &C->phonebook[0].age); getchar();
        printf("请输入第一个联系人的电话:"); scanf_s("%s", C->phonebook[0].phone, 12); getchar();
        printf("请输入第一个联系人的性别:"); scanf_s("%s", C->phonebook[0].sex, 5); getchar();
        C->length = 1;
        printf("\n");
        printf("你输入的第一个联系人信息为:\n");
        printf("姓名:%s\n", C->phonebook[0].name);
        printf("性别:%s\n", C->phonebook[0].sex);
        printf("年龄:%d\n", C->phonebook[0].age);
        printf("电话号码:%s\n", C->phonebook[0].phone);
        printf("通讯录创建成功;\n");
    }
    void Findbyname(Contacts*& C) {
        char name[MAX_NAME];
        int i;
        int m = 0;
        printf("请输入联系人姓名:");
        scanf_s("%s", name, 20);
        getchar();
        for (i = 0; i < C->length; i++) {
            if (strcmp(name, C->phonebook[i].name) == 0) {
                printf("该联系人的基本信息为:\n");
                printf("姓名:%s\n", C->phonebook[i].name);
                printf("性别:%s\n", C->phonebook[i].sex);
                printf("年龄:%d\n", C->phonebook[i].age);
                printf("电话号码:%s\n", C->phonebook[i].phone);
                getchar();
                m = 1;
                break;
            }
        }
        if (m == 0) {
            printf("你要找的联系人不存在\n");
            Clean();
        }
    }
    void Findbyphone(Contacts*& C) {
        char phone[MAX_NUMBER];
        int i;
        int m = 0;
        printf("请输入联系人电话:");
        scanf_s("%s", phone, 20);
        getchar();
        for (i = 0; i < C->length; i++) {
            if (strcmp(phone, C->phonebook[i].phone) == 0) {
                printf("该联系人的基本信息为:\n");
                printf("姓名:%s\n", C->phonebook[i].name);
                printf("性别:%s\n", C->phonebook[i].sex);
                printf("年龄:%d\n", C->phonebook[i].age);
                printf("电话号码:%s\n", C->phonebook[i].phone);
                getchar();
                m = 1;
                break;
            }
        }
        if (m == 0) {
            printf("你要找的联系人不存在\n");
            Clean();
        }
    }
    void FindContact(Contacts*& C) {
        system("cls");
        int n;
        printf("输入你想要的查询方法:\n");
        printf("------------------------\n");
        printf("------1.按名字查询-------\n");
        printf("------2.按电话查询-------\n");
        printf("------------------------\n");
        scanf_s("%d", &n);
        switch (n)
        {
        case 1:Findbyname(C); break;
        case 2:Findbyphone(C); break;
        }
    }//查找联系人,两种不同方法,按名字和电话        
    int AddContact(Contacts*& C) {
        int i;
        int m = 0;
        if (C->length == MAXSIZE)
            printf("联系人已满,无法继续添加。");
        else
        {
            printf("请输入该联系人的电话:"); scanf_s("%s", C->phonebook[C->length].phone, 12); getchar();
            for (i = 0; i < C->length; i++) {//判断电话号码是否已经存在
                if (strcmp(C->phonebook[C->length].phone, C->phonebook[i].phone) == 0) {
                    printf("该联系人已存在,请重新输入。");
                    C->phonebook[C->length].phone[MAX_NUMBER-1] = 0;
                    getchar();
                    m = 1;
                    break;
                }
            }
            if (m == 1) {
                return 0;
            }
            else {
                printf("请输入该联系人的姓名:"); scanf_s("%s", C->phonebook[C->length].name, 20); getchar();
                printf("请输入该联系人的年龄:"); scanf_s("%d", &C->phonebook[C->length].age); getchar();
                printf("请输入该联系人的性别:"); scanf_s("%s", C->phonebook[C->length].sex, 5); getchar();
                printf("该联系人添加成功\n");
                C->length++;
            }
        }
        return 1;
    }//添加联系人
    void Deletebyphone(Contacts*& C) {
        int i;
        int p = 0;
        char phone[MAX_NUMBER] = { '\0' };
        printf("请输入你要删除的联系人的电话号码:\n");
        scanf_s("%s", phone, 12); getchar();
        for (i = 0; i < C->length; i++) {
            if (strcmp(phone, C->phonebook[i].phone) == 0) {
                printf("该联系人的基本信息为:\n");
                break;
            }
            else {
                printf("未找到该联系人相关信息。\n");
                getchar(); break;
            }
        }
    }//删除联系人
    void Display(Contacts*& C) {
        int i;
        printf("通讯录中共%d人\n", C->length);
        printf("通讯录中的联系人为:\n");
        for (i = 0; i < C->length; i++) {
            printf("第%d位联系人的基本信息:\n", i + 1);
            printf("姓名:%s\n", C->phonebook[i].name);
            printf("性别:%s\n", C->phonebook[i].sex);
            printf("年龄:%d\n", C->phonebook[i].age);
            printf("电话号码:%s\n", C->phonebook[i].phone);
            printf("\n");
        }
        getchar();
    }
    void Distroy(Contacts*& C) {
        free(C);
        exit(0);
    }
    void meun(Contacts*& C) {
        while (true) {
            int k = 0;
            printf("---------------------------------\n");
            printf("-----1.创建通讯录。---------------\n");
            printf("-----2.查询联系人-----------------\n");
            printf("-----3.添加联系人-----------------\n");
            printf("-----4.删除联系人-----------------\n");
            printf("-----5.展示通讯录所有信息----------\n");
            printf("-----6.退出----------------------\n");
            printf("---------------------------------\n");
            scanf_s("%d", &k);
            switch (k)
            {
            case 1:CreateContacts(C); Clean(); break;
            case 2:FindContact(C); Clean(); break;
            case 3:AddContact(C); Clean(); break;
            case 4:Deletebyphone(C); Clean(); break;
            case 5:Display(C); Clean(); break;
            case 6:Distroy(C); break;
            }
        }
    }
    int main(void) {
        Contacts c;
        c.length = 0;
        Contacts *p = &c;
        meun(p);
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 12月13日
  • 已采纳回答 12月5日
  • 修改了问题 12月5日
  • 修改了问题 12月4日
  • 展开全部