//1.contect.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"contect.h"
#include<assert.h>
void InitContect(Contect* pc)
{
pc->sz = 0;
//memset(pc->data, 0, sizeof(pc->data));
//新增
pc->data = (PeoInfo*)calloc(DEFAULT, sizeof(PeoInfo));//1000个PeoInfo结构体大小字节内存
if (pc->data == NULL)
{
printf("%s\n", strerror(errno));
return;
}
pc->captity = DEFAULT;
}
int FindByName(const Contect* pc,char*name)
{
assert(pc);
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (0 == strcmp(pc->data[i].name, name))
{
return i;
}
}
return -1;
}
void Search(Contect* pc)
{
assert(pc);
int i = 0;
printf("请输入查找人的名字:");
char name[100] = { 0 };
int pos = 0;
for (i = 0; i < pc->sz; i++)
{
if (0 == strcmp(pc->data[i].name, name))
{
pos = i;
}
}
printf("%-20s %-3d %-5s %-11d %-5s\n", "姓名", "年龄", "性别", "电话", "地址");
printf("%-20s %-3d %-5s %-11d %-5s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr);
}
enum
{
NAME,
AGE,
SEX,
TEL,
ADDR,
EXIT
};
void Modify(Contect* pc)
{
printf("请输入要修改的名字:");
char name[100] = { 0 };
char temp_name[100] = { 0 }; char temp_sex[100] = { 0 }; long long temp_tel=0; char temp_addr[100] = { 0 };
int temp_age=0;
scanf("%s", name);
int pos = FindByName(pc, name);
if (pos == -1)
return;
int i = 0;
int input = 1;
printf("请选择要修改的项:0 姓名 1 年龄 2 性别 3 电话 4 地址 5 停止修改");
while (input)
{
scanf("%d", &i);
switch (i)
{
case NAME:
printf("请选择要修改的内容:");
scanf("%s", temp_name);
memcpy(pc->data[pos].name, temp_name, sizeof(temp_name));
break;
case AGE:
printf("请选择要修改的内容:");
scanf("%d", &temp_age);
pc->data[pos].age = temp_age;
break;
case SEX:
printf("请选择要修改的内容:");
scanf("%s", temp_sex);
memcpy(pc->data[pos].sex, temp_sex, sizeof(temp_sex));
break;
case TEL:
printf("请选择要修改的内容:");
scanf("%lld", &temp_tel);
pc->data[pos].tele = temp_tel;
break;
case ADDR:
printf("请选择要修改的内容:");
scanf("%s", temp_addr);
memcpy(pc->data[pos].addr, temp_addr, sizeof(temp_addr));
break;
case EXIT:
free(pc->data);
pc->data = NULL;
pc->captity = 0;
pc->sz = 0;
return;
default:
break;
}
}
printf("修改完毕");
}
void DelContect(Contect* pc)
{
if (pc->sz == 0)
{
printf("通讯录为空");
return;
}
char name[100] = { 0 };
printf("请输入要删除的人的名字:");
scanf("%s", name);
//找到
int pos = FindByName(pc, name);
if (pos == -1)
{
return;
}
//删除
for (int i = pos; i < pc->sz-1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("删除成功");
}
void CheckCapacity(Contect* pc)
{
if (pc->sz == pc->captity)
{
//reaclloc(char*,size_t)
PeoInfo* ptr = realloc(pc->data, (pc->captity * 2) * sizeof(PeoInfo));
if (ptr != NULL)
{
pc->data = ptr;
pc->captity *= 2;
}
}
}
void AddContect(Contect* pc)
{
CheckCapacity(pc);
//if (pc->sz > 1000)
//{
// printf("通讯录已满");
// return;
//}
printf("输入名字:");
scanf("%s", pc->data[pc->sz].name);
printf("输入年龄:");
scanf("%d", &(pc->data[pc->sz].age));
printf("输入性别:");
scanf("%s", pc->data[pc->sz].sex);
printf("输入电话:");
scanf("%lld", &(pc->data[pc->sz].tele));
printf("输入地址:");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
}
void PrintContect(Contect* pc)
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
printf("%s %d %s %lld %s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
}
}
//2 contect.h
#pragma once
#include<string.h>
#include<stdio.h>
#define DEFAULT 1000
typedef struct PeoInfo
{
char name[20];
char sex[5];
int age;
long long tele;
char addr[30];
}PeoInfo;
typedef struct Contect
{
PeoInfo* data;
int captity;
//PeoInfo data[DEFAULT];//存放1000人信息
int sz;//已经保存的信息个数
}Contect;
void CheckCapacity(Contect* pc);
void InitContect(Contect* pc);
void AddContect(Contect* pc);
void PrintContect(Contect* pc);
int FindByName(const Contect* pc, char*name);
void DelContect(Contect* pc);
void Search(Contect* pc);
void Modify(Contect* pc);
//3.test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"contect.h"
enum Option
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SORT,
PRINT
};
void menu()
{
printf("**************************\n");
printf("******1.add 2.del ***\n");
printf("******3.search 4.modify***\n");
printf("******5.sort 6.printf***\n");
printf("******0.exit ****\n");
printf("**************************\n");
}
void test()
{
int input = 0;
Contect con;//通讯录
//初始化
InitContect(&con);
char name[100] = { 0 };
do
{
menu();
scanf("%d", &input);
switch (input)
{
case ADD:
AddContect(&con);
break;
case DEL:
DelContect(&con);
break;
case SEARCH:
Search(&con);
break;
case MODIFY:
Modify(&con);
break;
case SORT:
break;
case PRINT:
PrintContect(&con);
break;
default:
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
1.其中主要是realloc和calloc函数的使用:realloc(char*p,SIZE)其中p是原内存地址,如果扩容的内存以原内存为起始地址,则返回源地址;否则将申请新内存,新的地址
(PeoInfo*)calloc(DEFAULT, sizeof(PeoInfo));//1000个PeoInfo结构体大小字节内存