弦断呀~ 2021-05-22 10:39 采纳率: 100%
浏览 18
已采纳

大佬们看看孩子吧,我遇到错误的地方在添加联系人时候,realloc出现错误。

//头文件

#define _CRT_SECURE_NO_WARNINGS 1
//#define MAX 1000
#define DEFAULT_SZ 3
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 80
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<Windows.h>
struct PeoInfo
{
    char name[MAX_NAME];
    char sex[MAX_SEX];
    char tele[MAX_TELE];
    char addr[MAX_ADDR];
    int age;
};


//通讯录类型
struct Contact
{
    int size;
    int capacity;//当前通讯录的最大容量
    struct PeoInfo* data;//存放个人的信息
};

//声明函数
//初始化通讯录
void InitContact(struct Contact* ps);

//增加一个信息到通讯录
void AddContact(struct Contact* ps);
//打印通讯录中的信息
void ShowContact(const struct Contact* ps);
//删除通讯录中的信息
void DELContact(struct Contact* ps);
//查找通讯录中人的信息
void SearchContact(const struct Contact*ps);
//修改通讯录中人的信息
void ModifyContact(struct Contact* ps);
//排序通讯录中人的信息
void SortContact(struct Contact*p);
//销毁数据
void DestroyContact(struct Contact* p);
enum Option
{
    EXIT,
    ADD,
    DEL,
    SEARCH,
    MODIFY,
    SHOW,
    SORT
};

 

//主函数

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{
    printf("******************************************\n");
    printf("******** 1.add            2.del   ********\n");
    printf("******** 3.search         4.modify********\n");
    printf("******** 5.show           6.sort  ********\n");
    printf("*********0.exit                   ********\n");
    printf("******************************************\n");
    printf("******************************************\n");
}

int main()
{
    int input = 0;
    //创建通讯录
    struct Contact con;//con就是通讯录.里边包含:data指针和size,capacity 
    //初始化通讯录
    InitContact(&con);
    //

    do
    {
        menu();
        printf("请选择:>");
        scanf("%d", &input);
        switch (input)
        {
        case ADD:
            AddContact(&con);
            break;
        case DEL:
            DELContact(&con);
            break;
        case SEARCH:
            SearchContact(&con);
            break;
        case MODIFY:
            ModifyContact(&con);
            break;
        case SHOW:
            ShowContact(&con);
            break;
        case SORT:
             SortContact(&con);
            break;
        case EXIT:
            printf("通讯录退出\n");
            DestroyContact(&con);
            break;
        default:
            printf("选择错误\n");
            break;
        }
    } while (input);
}

 

//函数实现

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void InitContact(struct Contact* ps)
{
    ps->data = (struct PeoInfo*)malloc(sizeof(ps->data) * DEFAULT_SZ);
    if (ps->data == NULL)
        return;
    ps->size = 0;//设置通讯录最初只有0个元素
    ps->capacity = DEFAULT_SZ;

}

static int FindByName(const struct Contact* ps, const char name[MAX_NAME])
{
    int i = 0;
    for (i = 0; i < ps->size; i++)
    {
        if (0 == strcmp(name, ps->data[i].name))
        {
            return i;
        }
    }
    return -1;
}

void Checkcapacity(struct Contact* ps)
{
    if (ps->size == ps->capacity)
    {
        struct PeoInfo* ptr = (struct PeoInfo*)realloc(ps->data, (ps->capacity + 2) * sizeof(struct PeoInfo));
        if (ptr!= NULL)
        {

            ps->data = ptr;
            ps->capacity += 2;
            printf("增容成功");
        }
        else
        {
            printf(strerror(errno));
        }
    }

}

void AddContact(struct Contact* ps)
{
    //检测当前通讯录容量
    Checkcapacity(ps);
    printf("请输入名字:>\n");
    scanf("%s", ps->data[ps->size].name);
    printf("请输入性别:>\n");
    scanf("%s", ps->data[ps->size].sex);
    printf("请输入年龄:>\n");
    scanf("%d", &(ps->data[ps->size].age));
    printf("请输入电话号码:>\n");
    scanf("%s", ps->data[ps->size].tele);
    printf("请输入家庭地址:>\n");
    scanf("%s", ps->data[ps->size].addr);
    ps->size++;
    printf("添加成功\n");
}

void ShowContact(const struct Contact* ps)
{
    int i = 0;
    if (ps->size == 0)
    {
        printf("通讯录为空\n");
        system("pause");
        system("cls");
    }
    else
    {
        printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\t\n", "名字", "性别", "年龄", "电话号码", "家庭住址");
        for (i = 0; i < ps->size; i++)
        {
            printf("%-20s\t%-4s\t%-5d\t%-12s\t%-20s\t\n",
                ps->data[i].name,
                ps->data[i].sex,
                ps->data[i].age,
                ps->data[i].tele,
                ps->data[i].addr);
        }
        system("pause");
        system("cls");
    }
}

void DELContact(struct Contact* ps)
{
    int pos = 0;
    char name[MAX_NAME];
    printf("请输入您要删除人的名字:>");
    scanf("%s", name);
    //查找要删除的人在上面位置
    pos = FindByName(ps, name);
    //找到返回名字所在元素下标,找不到返回-1

    if (pos == -1)
    {
        printf("无此联系人!\n");
        system("pause");
        system("cls");
    }
    else
    {
        int j = 0;
        for (j = pos; j < ps->size - 1; j++)
        {
            ps->data[j] = ps->data[j + 1];
        }
        ps->size--;
        printf("删除成功\n");
        system("pause");
        system("cls");
    }
}

void SearchContact(const struct Contact* ps)
{
    int pos = 0;
    char name[MAX_NAME];
    printf("请输入您要查找人的名字:>");
    scanf("%s", name);
    pos = FindByName(ps, name);
    if (pos == -1)
    {
        printf("无此联系人!\n");
        system("pause");
        system("cls");
    }
    else
    {
        printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\t\n", "名字", "性别", "年龄", "电话号码", "家庭住址");
        printf("%-20s\t%-4s\t%-5d\t%-12s\t%-20s\t\n",
            ps->data[pos].name,
            ps->data[pos].sex,
            ps->data[pos].age,
            ps->data[pos].tele,
            ps->data[pos].addr);
        system("pause");
        system("cls");
    }
}

static void menu1()
{
    printf("******************************************\n");
    printf("******** 1.姓名            2.年龄   ********\n");
    printf("******** 3.性别           4.电话号码******\n");
    printf("******** 5.家庭住址                 *******\n");
    printf("*********0.exit                   ********\n");
    printf("******************************************\n");
    printf("******************************************\n");
}
void ModifyContact(struct Contact* ps)
{
    int pos = 0;
    char name[MAX_NAME];
    printf("请输入您要修改人的名字");
    scanf("%s", name);
    pos = FindByName(ps, name);
    if (-1 == pos)
    {
        printf("要修改人的信息不存在\n");
    }
    else
    {
        int input = 0;
        do
        {
            system("cls");
            input = 0;
            menu1();
            printf("请选择您需要更改的选项:");
            scanf("%d", &input);
            switch (input)
            {
            case 1:
                printf("请输入名字:>\n");
                scanf("%s", ps->data[pos].name);
                break;
            case 2:
                printf("请输入性别:>\n");
                scanf("%s", ps->data[pos].sex);
                break;
            case 3:
                printf("请输入年龄:>\n");
                scanf("%d", &(ps->data[pos].age));
                break;
            case 4:
                printf("请输入电话号码:>\n");
                scanf("%s", ps->data[pos].tele);
                break;
            case 5:
                printf("请输入家庭地址:>\n");
                scanf("%s", ps->data[pos].addr);
                break;
            case 0:
                printf("正在退出,请稍后....\n");
                Sleep(1000);
                system("cls");
                break;
            default:
                printf("非法输入\n");
                continue;
                if (input)
                {
                    printf("修改成功\n");
                    system("pause");
                    system("cls");
                }
            }
        } while (input);

    }
}
void SortContact(struct Contact* ps)
{
    int i = 0;
    int j = 0;
    struct PeoInfo s = { 0 };
    for (i = 0; i < ps->size; i++)
    {
        for (j = 0; j <= ps->size - i - 1; j++)
        {
            if (strcmp(ps->data[j].name, ps->data[j + 1].name) > 0)
            {
                s = ps->data[j];
                ps->data[j] = ps->data[j + 1];
                ps->data[j + 1] = s;
            }
        }
    }
}

void DestroyContact(struct Contact* ps)
{
    free(ps->data);
    ps->data = NULL;
}

  • 写回答

1条回答 默认 最新

  • qfl_sdu 2021-05-22 11:22
    关注

    PeoInfo* data;这样声明的,你在AddContact(struct Contact* ps)的时候,新插入的人你都没有申请内存空间(new PeoInfo),直接用ps->data[].xx,不崩才怪呢。

    ps->data[ps->size] = new PeoInfo;以后,再去scanf("%s", ps->data[ps->size].name)这样才行。

    如有帮助,请采纳一下,谢谢。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 51单片机中C语言怎么做到下面类似的功能的函数(相关搜索:c语言)
  • ¥15 seatunnel 怎么配置Elasticsearch
  • ¥15 PSCAD安装问题 ERROR: Visual Studio 2013, 2015, 2017 or 2019 is not found in the system.
  • ¥15 (标签-MATLAB|关键词-多址)
  • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
  • ¥500 52810做蓝牙接受端
  • ¥15 基于PLC的三轴机械手程序
  • ¥15 多址通信方式的抗噪声性能和系统容量对比
  • ¥15 winform的chart曲线生成时有凸起
  • ¥15 msix packaging tool打包问题