吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 855|回复: 3
收起左侧

[求助] C语言实现通讯录,读取和删除联系人的时候会显示运行异常,求问怎么解决

[复制链接]
djdgf4 发表于 2022-7-15 08:25
本帖最后由 djdgf4 于 2022-7-15 15:56 编辑

小白不懂,这样算是使用链表了吗

[Asm] 纯文本查看 复制代码
/*
/*
以本班同学的具体数据为背景,设计一个本班同学通讯录
实现以下功能:
1) 通讯录编辑(添加、删除);
2) 按不同的项进行查找;
3) 对已存在的通讯录按不同的项排序;
4) 将通讯录写入文件;
5) 从文件读入通讯录。
备注:通讯录至少应该有以下数据项:姓名,地址,电话,邮编,E-mail。
*/

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define NAME_LEN 40
#define ADDRESS_LEN 60
#define E_LEN 30
#define MAX 1000

//*****************声明*********************//
void menu();
void InitContact(struct Contact* ps);
void Add(struct Contact* p);
void Del(struct Contact* p);
void Moidfy(struct Contact* p);
void Search(struct Contact* p);
void Sort(struct Contact* p);
int FindValue(struct Contact* p, char* name);
void Show(struct Contact* p);
int SaveFILE(struct Contact* p);

//***************联系人信息*****************//
struct people
{
        char name[NAME_LEN];                        //姓名
        char address[ADDRESS_LEN];                //地址
        int telephone_num;                                //电话
        int Postal;                                                //邮编
        char E_mail[E_LEN];                                //E-mail
};

//***************通讯录类型*****************//
struct Contact
{
        struct people data[MAX];        //存放1000个信息
        int size;                                        //记录当前结构体内已经有的元素个数
};

int main()
{
        unsigned int input = 0;
        
        struct Contact con;//创建通讯录,里面包含1000个元素的数和size
        
        InitContact(&con);//初始化通讯录

        do
        {
                menu();
                printf("请选择:>");
                scanf("%d", &input);
                switch (input)
                {
                case 1: Add(&con);
                        
                                break; 
                case 2: Del(&con);
                        
                                break; 
                case 3: Search(&con);
                        
                                break; 
                case 4: Moidfy(&con);
                        
                                break; 
                case 5: Show(&con);
                        
                                break; 
                case 6: Sort(&con);
                        
                                break; 
                case 0: {
                        SaveFILE(&con);
                        printf("退出通讯录\n");
                        break; }
                default:        printf("选择错误\n");
                        break;
                }
        } while (input);
        return 0;
}

void menu()
{
        printf("\n");
        printf("---------------------------------\n");
        printf("**      1. 添加联系人          **\n");
        printf("**      2. 删除联系人          **\n");
        printf("**      3. 查找联系人          **\n");
        printf("**      4. 修改联系人          **\n");
        printf("**      5. 显示所有联系人      **\n");
        printf("**      6. 按姓名排序联系人    **\n");
        printf("**      0. exit                **\n");
        printf("---------------------------------\n");
}

//***************初始化通讯录***************//
void InitContact(struct Contact* ps)
{
        memset(ps->data, 0, sizeof(ps->data));
        ps->size = 0;//通讯录最初只有0个元素
}

//**************添加联系人信息**************//
void Add(struct Contact *p)
{
        if (p->size >= MAX)
                printf("通讯录已满,无法增加\n");
        else
        {
                printf("请输入姓名:>");
                scanf("%s", p->data[p->size].name);
                printf("请输入住址:>");
                scanf("%s", p->data[p->size].address);
                printf("请输入电话:>");
                scanf_s("%d", &p->data[p->size].telephone_num);
                printf("请输入邮编:>");
                scanf("%d", &p->data[p->size].Postal);
                printf("请输入E-mail:>");
                scanf("%s", p->data[p->size].E_mail);

                p->size++;
                printf("添加成功\n");
        }
}

//**************删除联系人信息**************//
void Del(struct Contact* p)
{
        char name[NAME_LEN];
        int temp = 0;//用来确认是否删除

        if (p->size <= 0) {
                printf("通讯录中没有联系人,请添加!\n");
        }
        else
        {
                printf("查找:");
                scanf("%s", name);
                int flag = FindValue(p, name);
                if (flag == -1)
                {
                        printf("联系人不存在!\n");
                }
                else
                {
                        printf("确认删除?\n 1确认\n 2取消\n");
                        scanf("%d", temp);
                        if (temp == '1')
                        {
                                for (int i = 0; i < p->size - 1; i++)
                                {
                                        p->data[i] = p->data[i + 1];
                                }
                                p->size--;
                                printf("删除成功!\n");
                        }
                }
        }
}

//**************修改联系人信息**************//
void Moidfy(struct Contact* p)
{
        float get;
        char name[NAME_LEN];

        if (p->size <= 0) {
                printf("通讯录中没有联系人,请添加!\n");
        }
        else
        {
                printf("查找:");
                scanf("%s", name);
                int flag = FindValue(p, name);
                if (flag == -1)
                        printf("联系人不存在!\n");
                else
                        printf("输入0退出修改,否则继续:>");
                scanf("%f", &get);
                if (get != 0)
                {
                        printf("请输入姓名:>");
                        scanf("%s", p->data[flag].name);
                        printf("请输入住址:>");
                        scanf("%s", p->data[flag].address);
                        printf("请输入电话:>");
                        scanf_s("%d", &p->data[flag].telephone_num);
                        printf("请输入邮编:>");
                        scanf("%d", &p->data[flag].Postal);
                        printf("请输入E-mail:>");
                        scanf("%s", p->data[flag].E_mail);

                        printf("修改成功!");
                }
        }
}

//**************查找联系人信息**************//
void Search(struct Contact* p)
{
        char name[NAME_LEN];
        printf("查找:");
        scanf("%s", name);
        int flag = FindValue(p, name);
        if (flag == -1)
        {
                printf("联系人不存在!\n");
        }
        else
        {
                printf("\t姓名:>");
                printf("%s\n", p->data[flag].name);
                printf("\t住址:>");
                printf("%s\n", p->data[flag].address);
                printf("\t电话:>");
                printf("%d\n", p->data[flag].telephone_num);
                printf("\t邮编:>");
                printf("%d\n", p->data[flag].Postal);
                printf("\tE-mail:>");
                printf("%s\n", p->data[flag].E_mail);
        }
        
}

//****************排序并显示****************//
void Sort(struct Contact *p)
{
        if (p->size <= 0) {
                printf("通讯录中没有联系人,请添加!\n");
        }
        else
        {
                int  i, j;

                for (i = 0; i < p->size - 1; i++)
                {
                        for (j = 0; j < p->size - i - 1; j++)
                        {
                                if (strcmp(p->data[j].name, (p->data[j + 1]).name) > 0)
                                {
                                        struct people temp;
                                        temp = p->data[j];
                                        p->data[j] = p->data[j + 1];
                                        p->data[j + 1] = temp;
                                }
                        }
                }
                printf("排序成功!\n");
                for (i = 0; i < p->size; i++)
                {
                        printf("\t%s\n", *(p->data[i].name));
                }
        }
}

//*****************按姓名查找****************//
int FindValue(struct Contact* p, char* name)
{
        int i = 0;
        for (i = 0; i < p->size; i++)
        {
                if (strcmp(p->data[i].name, name) == 0)
                        return i;
        }
        return -1;
}

//***************显示通讯录*****************//
void Show(struct Contact* p)
{

        FILE* fp = NULL;
        fp = fopen("contact.txt", "r"); //可修改通讯录保存路径
        if (NULL == fp)
        {
                printf("打开文件失败……\n");
                exit(1);
        }

        for (int i = 0; i < p->size; i++)
        {
                fscanf(fp, "%-z10s%-10s%-10d%-10d%-10s\n ",
                        p->data[i].name,
                        p->data[i].address,
                        p->data[i].telephone_num,
                        p->data[i].Postal,
                        p->data[i].E_mail);
        }
        fclose(fp);
        fp = NULL;
        for (int i = 0; i < p->size; i++)
        {
                printf("%-10s%-10s%-10d%-10d%-10s\n ",
                        p->data[i].name,
                        p->data[i].address,
                        p->data[i].telephone_num,
                        p->data[i].Postal,
                        p->data[i].E_mail);
        }

}

//****************保存通讯录*****************//
int SaveFILE(struct Contact *p)
{

        FILE* fp = NULL;
        fp = fopen("contact.txt", "a"); //可修改通讯录保存路径
        if (NULL == fp)
        {
                printf("打开文件失败……\n");
                exit(-1);
        }

        for (int i = 0; i < p->size; i++)
        {
                fprintf(fp, "%-10s%-10s%-10d%-10d%-10s\n ",
                        p->data[i].name,
                        p->data[i].address,
                        p->data[i].telephone_num,
                        p->data[i].Postal,
                        p->data[i].E_mail );
        }
        fclose(fp);
        fp = NULL;
        return 0;}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

yk2014 发表于 2022-7-15 09:15
Add的时候判断一下,电话号码需要大于10位的最大值,小于12位的最小值才添加
zhangbo093 发表于 2022-7-15 11:11
楼主好,把
scanf_s("%d"
改成
scanf_s("%11d"
试试看?
cary_云飞扬 发表于 2022-7-15 11:11
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-12 20:01

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表