m0_70808774 2023-04-18 12:11 采纳率: 100%
浏览 21
已结题

C语言编写通讯录realloc问题

用C语言编写通讯录存放联系人信息,开辟动态空间,初始时设置容量为2人,容量满则扩充容量变为4人,但是输入结束后打印,第二个联系人变成乱码。继续扩大容量至6人,第3人与第4人不乱码,只有第二个人发生问题,请问是为什么呢?刚学没多久,好慌乱

头文件中:

//插入头文件
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NUM 2

struct people
{
    char name[30];
    int age;
    char num[30];
};
struct contact
{
    struct people *data;
    int sz;
    int capacity;

};

//初始化
void first(struct contact* con);
//读文件
void read(struct contact* con);
//添加用户
void Add(struct contact* con);
void write(struct contact* con);
void exit(struct contact* con);

函数源代码:

#include"contact.h"
//初始化
void first(struct contact* con)
{
    struct people*str = (struct people*)malloc(sizeof(struct people));
    if (str == NULL)
    {
        perror(first);
        printf("初始化失败\n");
    }
    else
    {
        con->data = str;       //编译到这里con->data[1]里的内容就变成了一堆问号
        con->sz = 0;
        con->capacity = NUM;
    }
}
//打印出联系人
void show(struct contact* con)
{
    int i = 0;
    printf("%-10s %-10s %-10s\n", "name", "age", "num");
    for (i = 0; i < con->sz; i++)
    {
        printf("%-10s %-10d %-10s\n", con->data[i].name, con->data[i].age, con->data[i].num);
    }
}
//检查是否需要扩容
void Check(struct contact *con)
{
    if (con->sz == con->capacity)
    {
        struct people* str= (struct people*)realloc(con->data, sizeof(struct people) * (NUM + con->capacity));
        if (str == NULL)
        {
            perror(Check);
            printf("增容失败");
            return;
        }
        else
        {
            con->data = str;
            con->capacity += NUM;
            show(con);
        }
    }
    
}
//存入联系人
void Add(struct contact* con)
{
    Check(con);
    printf("请输入姓名:");
    scanf("%s", con->data[con->sz ].name);
    printf("请输入年龄:");
    scanf("%d", &con->data[con->sz].age);
    printf("请输入号码:");
    scanf("%s", con->data[con->sz].num );
    con->sz++;
    printf("输入成功\n");

img

展开全部

  • 写回答

3条回答 默认 最新

  • CSDN专家-sinJack 2023-04-18 12:28
    关注

    问题出在Add函数中,每次添加联系人时,使用了con->data[con->sz]来存储新的联系人信息,但是在Check函数中,如果需要扩容,重新分配了内存空间,此时con->data指向的是新的内存空间,而之前使用con->data[con->sz]存储的联系人信息并没有被复制到新的内存空间中,因此第二个联系人的信息就变成了乱码。

    解决方法是,在Check函数中,重新分配内存空间后,需要将之前存储的联系人信息复制到新的内存空间中。可以使用memcpy函数来实现。
    修改后的Check函数如下:

    void Check(struct contact *con)
    {
        if (con->sz == con->capacity)
        {
            struct people* str= (struct people*)realloc(con->data, sizeof(struct people) * (NUM + con->capacity));
            if (str == NULL)
            {
                perror(Check);
                printf("增容失败");
                return;
            }
            else
            {
                memcpy(str, con->data, sizeof(struct people) * con->sz); //复制联系人信息到新的内存空间中
                con->data = str;
                con->capacity += NUM;
                show(con);
            }
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 4月26日
  • 已采纳回答 4月19日
  • 创建了问题 4月18日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部