C语言实现模糊查找通讯录(附源码)

知识储备

字符串相关操作函数:
    int atoi(const char *nptr);
    功能:字符串转int类型
    long atol(const char *nptr);
    功能:字符串转long类型
    long long atoll(const char *nptr);
    功能:字符串转long long类型
    double atof(const char *nptr);
    功能:字符串转double类型


char *strstr(const char *haystack,const char *needle);
功能:在haystack中查找是否存在子串needle
返回值:needle在haystack中首次出现的位置,如果找不到则返回NULL

int sprintf(char *str,const char *format, ...);
功能:把各种类型的数据输出给字符串str
返回值:转换后字符个数

int sscanf(const char *str,const char *format,...);
功能:从str中解析读取数据到变量中
返回值:成功解析出来的变量个数
void *memcpy(void *dest,const void *src,size_t n);
  功能:从src位置拷贝n个字节到dest的位置
  功能:链式调用

  int memcmp(const void *s1,const void *s2,size_t n);
  功能:比较两块内存的值,按照字节比较,一旦比较出结果后面不再比较
    返回值: s1 == s2  0
             s1 < s2  负数
             s1 > s2  正数

小项目:通讯录系统

要求:存储联系人信息:
        姓名、性别、电话 
     最大存储量50人
功能要求:
    1、增加联系人
    2、按名字删除联系人
    3、按名字修改联系人信息
    4、查找联系人,按照电话或者姓名,支持模糊查找
    5、显示所有联系人信息
    6、退出系统

代码实现

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>

char (*name)[20] =  NULL;
char (*sex)[5] = NULL; 
char (*number)[12] = NULL;

void space()
{
	name = calloc(20*5,1);
	sex  = calloc(5*5,1);
	number = calloc(12*5,1);
}
void  add()
{
	//通讯录满了的情况
	int j = 0;
	while(*name[j]) j++;
	if(j == 5)
	{
		name = realloc(name,20*j*2);	
	}
	//通讯录没满
	int i = 0;
	while(*name[i]) i++;
	printf("请输入名字:");
	scanf("%s", name[i]);
	printf("请输入性别:");
	scanf("%s", sex[i]);
	printf("请输入电话号码:");
	scanf("%s", number[i]);
	printf("\n添加成功!\n");
}

void del()
{
	int i =  0, j = 0;
	printf("请输入要删除的姓名:");
	char ch[10] = {};
	scanf("%s", ch);
	for(;i<5;i++)
	{
		if(strstr(name[i],ch))
		{
			printf("编号:%d\n",i);
			printf("姓名     性别     号码\n");
			printf("%s       %s       %s\n", name[i], sex[i], number[i]);
			j++;
		}
	}
	if(j == 0)
	{
		printf("查无此人!\n");
		return;
	}
	else
	{
		printf("请选择删除的编号:");
		scanf("%d", &j);
		*name[j] = 0; 
		printf("删除成功!\n");
	}
}

void show()
{
	for(int i=0; *sex[i]!=0; i++)
	{
		if(*name[i])
		{
		printf("姓名     性别     号码\n");
		printf("%s        %s        %s\n", name[i], sex[i], number[i]);
		}
	}
	
}

void modify()
{	
	printf("请输入你要修改的人物信息的名字:");
	char ch[20] = {};
	scanf("%s", ch);
	int i = 0;
	while(strcmp(name[i],ch) !=0 && i<5) i++;
	if(i == 5)
	{
		printf("查无此人!\n");
		return;
	}
	else
	{
		printf("-----  1.姓名  -----\n");
		printf("-----  2.性别  -----\n");
		printf("-----  3.号码  -----\n");
		printf("请选择你要修该的信息:");
		int choice = 0;
		scanf("%d", &choice);
		switch(choice)
		{
			case 1:
				printf("请输入修改后的姓名:");
				scanf("%s", ch);
				strcpy(name[i],ch);
				printf("修改成功!\n");
				break;

			case 2:
				printf("请输入修改后的性别:");
				scanf("%s", ch);
				strcpy(sex[i],ch);
				printf("修改成功!\n");
				break;
	
			case 3:
				printf("请输入修改后的号码:");
				scanf("%s", ch);
				strcpy(number[i],ch);
				printf("修改成功!\n");
				break;
			default:
				printf("指令无效!\n");
		}
			
	}

}

void find()
{
	printf("请输入你要查找的人的名字或号码:");
	char ch[20] = {};
	scanf("%s", ch);
	int i = 0;
	for(;i<5;i++)
	{
		if(strstr(name[i],ch) !=0 || strstr(number[i],ch) !=0)
		{
			printf("姓名     性别     号码\n");
			printf("%s        %s        %s\n", name[i], sex[i], number[i]);
		}
	}
}
void menu(void)
{
	printf("--------------------------\n");
	printf("-----  1.添加联系人  -----\n");
	printf("-----  2.删除联系人  -----\n");
	printf("-----  3.查找联系人  -----\n");
	printf("-----  4.修改联系人  -----\n");
	printf("-----  5.显示联系人  -----\n");
	printf("-----  0.退出通讯录  -----\n");
	printf("--------------------------\n");

}


int main(int argc,const char* argv[])
{
	int choice = 0;
	space();	
	for(;;)
	{
		menu();	
		printf("请选择您需要的功能:");
		scanf("%d",&choice);
		switch(choice)
		{
			case 1: 
				add(); 
				break;
			case 2: 
				del(); 
				break;
			case 5: 
				show(); 
				break;
			case 4: 
				modify(); 
				break;
			case 3: 
				find(); 
				break;
			case 0: 
				printf("已退出!"); 
				return 0;
			default:
				printf("指令无效!");
		}
		

	}
	return 0;

}
  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值