多版本通讯录

开始写通讯录已经好久了,才把通讯录的多个版本整理完,下边我来谈谈实现通讯录过程中的一些问题,以及自己的心

得,另外附加代码。

通讯录要求:

1.增加信息   2.删除信息    3.查找信息  4.修改信息

5.显示信息   6.清除信息  7.按姓名排序  0.退出

我觉得,写代码之前一定要想清楚自己要实现的功能,应该怎么实现,大致应该清楚这些。

首先,静态通讯录,给出通讯录存储元素的总大小,通讯录里最多只能存储这么多信息。而通讯录的增删改查,通常

需要找到通讯录的最后一个元素的位置,或者是元素的个数,所以我们需要再定义一个结构体,第一个成员是通讯录

的信息,是个结构体数组,第二个元素是当前通讯录的信息个数,这样,增加信息的时候,如果通讯录信息个数等于

通讯录的最大存储元素数,此时无法增加。所以,增加的结构体还是蛮有用的。关于防止头文件重复包含,在这种小

项目中也是需要注意的。

代码:

//Contact.h
#ifndef __CONTACT_H__
#define __CONTACT_H__
#define NAME_MAX 12
#define SEX_MAX 4
#define TELE_MAX 12
#define ADDR_MAX 20
enum OP
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	DISPLAY,
	CLEAR,
	SORT
};
typedef struct person
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
}person;
typedef struct ConInfo
{
	person data[1000];
	int size;
}ConInfo,*pConInfo;
void init_con(pConInfo pcon);
void add_person(pConInfo pcon);
void dis_con(pConInfo pcon);
void del_con(pConInfo pcon);
void search_person(pConInfo pcon);
void clear_con(pConInfo pcon);
void modify_person(pConInfo pcon);
void sort_con(pConInfo pcon);
#endif
//contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Contact.h"
//#ifndef __CONTACT_H__
//#define __CONTACT_H__
#include<string.h>
#include<stdio.h>
static int find(pConInfo pcon, char *name)
{
	int i = 0;
	for (i = 0;i < pcon->size;i++)
	{
		if (strcmp(pcon->data[i].name, name) == 0)
			return i;
	}
	return -1;
}

void init_con(pConInfo pcon)
{
	pcon->size = 0;
}
void add_person(pConInfo pcon)
{
	if (pcon->size == 1000)
	{
		printf("通讯录已经满了\n");
		return;
	}
	int num = 0;//插入人数
	printf("请输入插入的人数:>");
	scanf("%d",&num);
	while (num--)
	{
		printf("请输入联系人姓名:>");
		scanf("%s",pcon->data [pcon->size].name);
		printf("请输入联系人年龄:>");
		scanf("%d", &(pcon->data[pcon->size].age));
		printf("请输入联系人性别:>");
		scanf("%s", pcon->data[pcon->size].sex);
		printf("请输入联系人电话:>");
		scanf("%s", pcon->data[pcon->size].tele);
		printf("请输入联系人地址:>");
		scanf("%s", pcon->data[pcon->size].addr);
		pcon->size++;
		printf("插入成功\n");
	}
}
void dis_con(pConInfo pcon)
{
	int i = 0;
	printf("通讯录信息如下:\n");
	printf("%12s%4s%4s%12s%20s\n","name","age","sex","tele","addr");
	for (i = 0;i < pcon->size;i++)
	{
		printf("%12s%4d%4s%12s%20s",
			pcon->data[i].name,
			pcon->data[i].age,
			pcon->data[i].sex, pcon->data[i].tele,
			pcon->data[i].addr);
		printf("\n");
	}
}
void del_con(pConInfo pcon)
{
	char name[NAME_MAX];
	int pos = 0;//查找的位置
	int index = 0;
	if (pcon->size == 0)
	{
		printf("通讯录已经是空的\n");
	}
	printf("请输入删除联系人的姓名:>");
	scanf("%s",name);
	pos = find(pcon, name);
	if (pos == -1)
	{
		printf("要查找的联系人不存在\n");
	}
	for (index = pos;index < pcon->size;index++)
	{
		memcpy(&(pcon->data [index]), &(pcon->data[index+1]),sizeof(person));
	}
	pcon->size--;
	printf("删除成功\n");
}
void search_person(pConInfo pcon)
{
	char name[NAME_MAX];
	int pos = 0;
	printf("请输入要查找联系人的姓名:>");
	scanf("%s",name);
	pos = find(pcon,name);
	if (pos == -1)
	{
		printf("要查找的联系人不存在\n");
	}
	printf("%12s%4d%4s%12s%20s",
		pcon->data[pos].name,
		pcon->data[pos].age,
		pcon->data[pos].sex, pcon->data[pos].tele,
		pcon->data[pos].addr);
	printf("\n");
}
void clear_con(pConInfo pcon)
{
	pcon->size = 0;
	printf("清空成功!\n");
}
void modify_person(pConInfo pcon)
{
	if (pcon->size == 0)
	{
		printf("通讯录为空");
	}
	char name[NAME_MAX];
	int pos = 0;
	printf("请输入要修改的联系人的姓名\n");
	scanf("%s",name);
	pos = find(pcon, name);
	if (pos == -1)
	{
		printf("要修改的联系人不存在\n");
		return;
	}
	printf("请输入修改后的信息\n");
	scanf("%s%d%s%s%s",
		pcon->data[pos].name,
		&(pcon->data[pos].age),
		pcon->data[pos].sex,
		pcon->data[pos].tele,
		pcon->data[pos].addr);
	printf("修改成功\n");
}
void sort_con(pConInfo pcon)
{
	int i = 0;
	int j = 0;
	int flag = 0;
	person tmp ;
	for (i = 0;i < pcon->size - 1;i++)
	{
		flag = 1;
		for (j = 0;j < pcon->size - 1 - i;j++)
		{
			if (strcmp(pcon->data[j].name, pcon->data[j + 1].name)> 0)
			{

				tmp = pcon->data[j];
				pcon->data[j] = pcon->data[j + 1];
				pcon->data[j + 1] = tmp;
				flag = 0;

			}

			if (flag == 1)
				break;
		}
	}
printf("排序成功\n");
dis_con(pcon);
}
//test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"Contact.h"

void menu()
{
	printf("*****1.add       2.del   ****\n");
	printf("*****3.search    4.modify****\n");
	printf("*****5.display   6.clear ****\n");
	printf("*****7.sort      0.exit  ****\n");
}
int main()
{
	ConInfo  pson = {0};
	init_con(&pson);
	int input = 1;
	while (input)
	{
		menu();
		printf("请选择:>");
		scanf("%d",&input);
		switch (input)
		{
		case ADD:
			add_person(&pson);
			break;
		case DEL:
			del_con(&pson);
			break;
		case SEARCH:
			search_person(&pson);
			break;
		case MODIFY:
			modify_person(&pson);
			break;
		case CLEAR:
			clear_con(&pson);
			break;
		case DISPLAY:
			dis_con(&pson);
			break;
		case SORT:
			sort_con(&pson);
			break;
		case EXIT:
			break;
		default:
			printf("输入错误");
			break;
		}
	}
	system("pause");
	return  0;
}

由于静态通讯录存在一定的缺陷,比如,开辟了很大一块空间,但是某人的朋友少,就会造成空间浪费。如果开辟的

太小,如果某人的朋友多,岂不是存不下吗??所以,动态通讯录专门用于解决这个问题。动态开辟,要多少开辟多

少,下边展示代码。

//contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Contact.h"
//#ifndef __CONTACT_H__
//#define __CONTACT_H__
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
static int find(pConInfo pcon, char *name)
{
	int i = 0;
	for (i = 0;i < pcon->size;i++)
	{
		if (strcmp(pcon->data[i].name, name) == 0)
			return i;
	}
	return -1;
}
void init_con(pConInfo pcon)
{
	pcon->size = 0;
	pcon->capacity = 2;
	pcon->data = (person *)malloc(2*sizeof(person));
	if (pcon->data == NULL)
	{
		printf("out of memory");
		return;
	}
}
void expand_capacity(pConInfo pcon)
{
	person *p = NULL;
	pcon ->data = (person *)realloc(pcon->data,(pcon->capacity+ INC_CAP)*sizeof(person));
	if (pcon->data == NULL)
	{
		printf("out of memory");
		exit(EXIT_FAILURE);
	}
	else
	{
		p = pcon->data;
	}
	pcon->capacity = pcon->capacity + INC_CAP;
}
void add_person(pConInfo pcon)
{
	if (pcon->size == pcon->capacity)
	{
		expand_capacity(pcon);
	}
	/*if (pcon->size == 0)
	{
		init_con(pcon);
	}*/

		printf("请输入联系人姓名:>");
		scanf("%s", pcon->data[pcon->size].name);
		printf("请输入联系人年龄:>");
		scanf("%d", &(pcon->data[pcon->size].age));
		printf("请输入联系人性别:>");
		scanf("%s", pcon->data[pcon->size].sex);
		printf("请输入联系人电话:>");
		scanf("%s", pcon->data[pcon->size].tele);
		printf("请输入联系人地址:>");
		scanf("%s", pcon->data[pcon->size].addr);
		pcon->size++;
		printf("插入成功\n");

}
void dis_con(pConInfo pcon)
{
	int i = 0;
	printf("通讯录信息如下:\n");
	printf("%12s%4s%4s%12s%20s\n", "name", "age", "sex", "tele", "addr");
	for (i = 0;i < pcon->size;i++)
	{
		printf("%12s%4d%4s%12s%20s",
			pcon->data[i].name,
			pcon->data[i].age,
			pcon->data[i].sex, pcon->data[i].tele,
			pcon->data[i].addr);
		printf("\n");
	}
}
void del_con(pConInfo pcon)
{
	char name[NAME_MAX];
	int pos = 0;//查找的位置
	int index = 0;
	if (pcon->size == 0)
	{
		printf("通讯录已经是空的\n");
	}
	printf("请输入删除联系人的姓名:>");
	scanf("%s", name);
	pos = find(pcon, name);
	if (pos == -1)
	{
		printf("要查找的联系人不存在\n");
	}
    else
	    {
	        for (index = pos;index < pcon->size;index++)
				{
					memcpy(&(pcon->data[index]), &(pcon->data[index + 1]), sizeof(person));
				}
			pcon->size--;
			printf("删除成功\n");
		}
}
void search_person(pConInfo pcon)
{
	char name[NAME_MAX];
	int pos = 0;
	printf("请输入要查找联系人的姓名:>");
	scanf("%s", name);
	pos = find(pcon, name);
	if (pos == -1)
	{
		printf("要查找的联系人不存在\n");
	}
	else
	printf("%12s%4d%4s%12s%20s",
		pcon->data[pos].name,
		pcon->data[pos].age,
		pcon->data[pos].sex,
		pcon->data[pos].tele,
		pcon->data[pos].addr);
	printf("\n");
}
void clear_con(pConInfo pcon)
{
	pcon->size = 0;
	printf("清空成功!\n");
}
void modify_person(pConInfo pcon)
{
	if (pcon->size == 0)
	{
		printf("通讯录为空");
	}
	char name[NAME_MAX];
	int pos = 0;
	printf("请输入要修改的联系人的姓名\n");
	scanf("%s", name);
	pos = find(pcon, name);
	if (pos == -1)
	{
		printf("要修改的联系人不存在\n");
		return;
	}
	else
	{
		printf("请输入修改后的信息\n");
		scanf("%s%d%s%s%s",
			pcon->data[pos].name,
			&(pcon->data[pos].age),
			pcon->data[pos].sex,
			pcon->data[pos].tele,
			pcon->data[pos].addr);
		printf("修改成功\n");
	}
}
void free_con(pConInfo pcon)
{
	free(pcon->data);
	pcon->data = NULL;
}
void sort_con(pConInfo pcon)
{
	int i = 0;
	int j = 0;
	int flag = 0;
	person tmp;
	for (i = 0;i < pcon->size - 1;i++)
	{
		flag = 1;
		for (j = 0;j < pcon->size - 1 - i;j++)
		{
			if (strcmp(pcon->data[j].name, pcon->data[j + 1].name)> 0)
			{

				tmp = pcon->data[j];
				pcon->data[j] = pcon->data[j + 1];
				pcon->data[j + 1] = tmp;
				flag = 0;

			}
			if (flag == 1)
				break;
		}
	}
	printf("排序成功\n");
	dis_con(pcon);
}
//test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"Contact.h"

void menu()
{
	printf("*****1.add       2.del   ****\n");
	printf("*****3.search    4.modify****\n");
	printf("*****5.display   6.clear ****\n");
	printf("*****7.sort      0.exit  ****\n");
}
int main()
{
	ConInfo  pson = { 0 };
	init_con(&pson);
	int input = 1;
	while (input)
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			add_person(&pson);
			break;
		case DEL:
			del_con(&pson);
			break;
		case SEARCH:
			search_person(&pson);
			break;
		case MODIFY:
			modify_person(&pson);
			break;
		case CLEAR:
			clear_con(&pson);
			break;
		case DISPLAY:
			dis_con(&pson);
			break;
		case SORT:
			sort_con(&pson);
			break;
		case EXIT:
			free_con(&pson);
			break;
		default:
			printf("输入错误");
			break;
		}
	}
	system("pause");
	return  0;
}
//contact.h
#ifndef __CONTACT_H__
#define __CONTACT_H__
#define NAME_MAX 12
#define SEX_MAX 4
#define TELE_MAX 12
#define ADDR_MAX 20
#define INC_CAP  2
enum OP
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	DISPLAY,
	CLEAR,
	SORT
};
typedef struct person
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
}person;
typedef struct ConInfo
{
	person *data;
	int size;
	int capacity;//当前电话本的容量
}ConInfo, *pConInfo;
void init_con(pConInfo pcon);
void add_person(pConInfo pcon);
void dis_con(pConInfo pcon);
void del_con(pConInfo pcon);
void search_person(pConInfo pcon);
void clear_con(pConInfo pcon);
void modify_person(pConInfo pcon);
void sort_con(pConInfo pcon);
void free_con(pConInfo pcon);
#endif

增加信息的时候发现容量不够,就扩容,哦,对了,结构体里必须再加一个成员,就是通讯录的容量。

现在还能清晰的记得,在之前做c++课程设计(我的课题是宾馆客房管理系统),老师给的要求就是,不要给我演示

的时候就是按顺序(就是先增加信息,再删除啊显示啊之类的),我当时就是没做好,现在,我来让我的通讯录实现

这个功能----把信息保存在文件中,每次运行时,只要把文件中的信息载入内存,就不用每次都是先录入信息。

下边展示代码:

//contact.h
#ifndef __CONTACT_H__
#define __CONTACT_H__
#define NAME_MAX 12
#define SEX_MAX 4
#define TELE_MAX 12
#define ADDR_MAX 20
#define INC_CAP  2
enum OP
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	DISPLAY,
	CLEAR,
	SORT
};
typedef struct person
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
}person;
typedef struct ConInfo
{
	person *data;
	int size;
	int capacity;//当前电话本的容量
}ConInfo, *pConInfo;
void init_con(pConInfo pcon);
void add_person(pConInfo pcon);
void dis_con(pConInfo pcon);
void del_con(pConInfo pcon);
void search_person(pConInfo pcon);
void clear_con(pConInfo pcon);
void modify_person(pConInfo pcon);
void sort_con(pConInfo pcon);
void free_con(pConInfo pcon);
void save_con(pConInfo pcon);
void load_con(pConInfo pcon);
#endif
//contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Contact.h"
//#ifndef __CONTACT_H__
//#define __CONTACT_H__
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
static int find(pConInfo pcon, char *name)
{
	int i = 0;
	for (i = 0;i < pcon->size;i++)
	{
		if (strcmp(pcon->data[i].name, name) == 0)
			return i;
	}
	return -1;
}
void init_con(pConInfo pcon)
{
	pcon->size = 0;
	pcon->capacity = 2;
	pcon->data = (person *)malloc(2 * sizeof(person));
	if (pcon->data == NULL)
	{
		printf("out of memory");
		return;
	}
	load_con(pcon);
}
void check_capacity(pConInfo pcon)
{
	person *p = NULL;
	pcon->data = (person *)realloc(pcon->data, (pcon->capacity + INC_CAP)*sizeof(person));
	if (pcon->data == NULL)
	{
		printf("out of memory");
		exit(EXIT_FAILURE);
	}
	else
	{
		p = pcon->data;
	}
	pcon->capacity = pcon->capacity + INC_CAP;
}
void add_person(pConInfo pcon)
{
	/*if (pcon->size == pcon->capacity)
	{
		expand_capacity(pcon);
	}*/
	/*if (pcon->size == 0)
	{
	init_con(pcon);
	}*/
	check_capacity(pcon);
	printf("请输入联系人姓名:>");
	scanf("%s", pcon->data[pcon->size].name);
	printf("请输入联系人年龄:>");
	scanf("%d", &(pcon->data[pcon->size].age));
	printf("请输入联系人性别:>");
	scanf("%s", pcon->data[pcon->size].sex);
	printf("请输入联系人电话:>");
	scanf("%s", pcon->data[pcon->size].tele);
	printf("请输入联系人地址:>");
	scanf("%s", pcon->data[pcon->size].addr);
	pcon->size++;
	printf("插入成功\n");

}
void dis_con(pConInfo pcon)
{
	int i = 0;
	printf("通讯录信息如下:\n");
	printf("%12s%4s%4s%12s%20s\n", "name", "age", "sex", "tele", "addr");
	for (i = 0;i < pcon->size;i++)
	{
		printf("%12s%4d%4s%12s%20s",
			pcon->data[i].name,
			pcon->data[i].age,
			pcon->data[i].sex, pcon->data[i].tele,
			pcon->data[i].addr);
		printf("\n");
	}
}
void del_con(pConInfo pcon)
{
	char name[NAME_MAX];
	int pos = 0;//查找的位置
	int index = 0;
	if (pcon->size == 0)
	{
		printf("通讯录已经是空的\n");
	}
	printf("请输入删除联系人的姓名:>");
	scanf("%s", name);
	pos = find(pcon, name);
	if (pos == -1)
	{
		printf("要查找的联系人不存在\n");
	}
	else
	{
		for (index = pos;index < pcon->size;index++)
		{
			memcpy(&(pcon->data[index]), &(pcon->data[index + 1]), sizeof(person));
		}
		pcon->size--;
		printf("删除成功\n");
	}
}
void search_person(pConInfo pcon)
{
	char name[NAME_MAX];
	int pos = 0;//存储查找到的元素的位置
	printf("请输入要查找联系人的姓名:>");
	scanf("%s", name);
	pos = find(pcon, name);
	if (pos == -1)
	{
		printf("要查找的联系人不存在\n");
	}
	else
		printf("%12s%4d%4s%12s%20s",
			pcon->data[pos].name,
			pcon->data[pos].age,
			pcon->data[pos].sex,
			pcon->data[pos].tele,
			pcon->data[pos].addr);
	printf("\n");
}
void clear_con(pConInfo pcon)
{
	pcon->size = 0;
	printf("清空成功!\n");
}
void modify_person(pConInfo pcon)
{
	if (pcon->size == 0)
	{
		printf("通讯录为空");
	}
	char name[NAME_MAX];
	int pos = 0;
	printf("请输入要修改的联系人的姓名\n");
	scanf("%s", name);
	pos = find(pcon, name);
	if (pos == -1)
	{
		printf("要修改的联系人不存在\n");
		return;
	}
	else
	{
		printf("请输入修改后的信息\n");
		scanf("%s%d%s%s%s",
			pcon->data[pos].name,
			&(pcon->data[pos].age),
			pcon->data[pos].sex,
			pcon->data[pos].tele,
			pcon->data[pos].addr);
		printf("修改成功\n");
	}
}
void free_con(pConInfo pcon)
{
	free(pcon->data);
	pcon->data = NULL;
}
void sort_con(pConInfo pcon)
{
	int i = 0;
	int j = 0;
	int flag = 0;
	person tmp;
	for (i = 0;i < pcon->size - 1;i++)
	{
		flag = 1;
		for (j = 0;j < pcon->size - 1 - i;j++)
		{
			if (strcmp(pcon->data[j].name, pcon->data[j + 1].name)> 0)
			{

				tmp = pcon->data[j];
				pcon->data[j] = pcon->data[j + 1];
				pcon->data[j + 1] = tmp;
				flag = 0;

			}
			if (flag == 1)
				break;
		}
	}
	printf("排序成功\n");
	dis_con(pcon);
}
void save_con(pConInfo pcon)
{
	FILE *pwrite = fopen("contact.dat","w");
	int i = 0;
	if (pwrite == NULL)
	{
		perror("open the file for write");
		exit(EXIT_FAILURE);
	}
	else
	{
		for (i = 0;i < pcon->size;i++)
		{
		    fwrite(&(pcon->data[i]),sizeof(person),1,pwrite);
		}
	}
	fclose(pwrite);
}
void load_con(pConInfo pcon)
{
	FILE *pread = fopen("contact.dat","r");
	int i = 0;
	person tmp = { 0 };
	if (pread == NULL)
	{
		perror("open the file for read");
		exit(EXIT_FAILURE);
	}
	else
	{
		while(fread(&tmp, sizeof(person), 1, pread))
		{
			check_capacity(pcon);
			pcon->data[i] = tmp;
			pcon->size++;
			i++;
		}
	}
	fclose(pread);
}
//test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"contact.h"

void menu()
{
	printf("*****1.add       2.del   ****\n");
	printf("*****3.search    4.modify****\n");
	printf("*****5.display   6.clear ****\n");
	printf("*****7.sort      0.exit  ****\n");
}
int main()
{
	ConInfo  pson = { 0 };

	init_con(&pson);
	int input = 1;
	while (input)
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			add_person(&pson);
			break;
		case DEL:
			del_con(&pson);
			break;
		case SEARCH:
			search_person(&pson);
			break;
		case MODIFY:
			modify_person(&pson);
			break;
		case CLEAR:
			clear_con(&pson);
			break;
		case DISPLAY:
			dis_con(&pson);
			break;
		case SORT:
			sort_con(&pson);
			break;
		case EXIT:
			save_con(&pson);
			free_con(&pson);
			break;
		default:
			printf("输入错误");
			break;
		}
	}
	system("pause");
	return  0;
}

在做文件版本时,我就碰到信息导入不到内存的原因。是因为导入信息时判定条件不对。所以,不管做任何事,大事

也好,小事也罢,踏踏实实做好。

这次也才懂得,并不是所有的函数实现都必须在头文件中声明,只有是函数接口才在头文件中声明。

其实,我们也可以把信息保存在数据库文件,这个功能,之后再实现~~

一位学长在自己的博客中提到,学习,会遇见不同层次的人;分享,确实能获得更多~~对我希望自己从分享中学到更

多~~

时间: 2024-08-07 11:21:38

多版本通讯录的相关文章

通讯录的实现(三)文件版本

我们再做通讯录这个小项目的时候,前边已经实现过静态版本和动态版本了,今天我来实现一下文件版本的,文件版本会将你以前录入的信息保存起来,这样方便以后的查询和操作. 文件版本实现起来并不难,只需在动态版本上稍作修改即可.下面是我的源码: "Contact.h" #ifndef __CONTACT_H__ #define __CONTACT_H__ #include <stdio.h> #include <string.h> #include<stdlib.h&

iOS开发--系统通讯录的访问与添加联系人

公司项目有访问通讯录的需求,所以开始了探索之路.从开始的一无所知,到知识的渐渐清晰.这一切要感谢广大无私分享的 “coder”,注:我是尊称的语气! 苹果提供了访问系统通讯录的框架,以便开发者对系统通讯录进行操作.(此demo为纯代码),想要访问通讯录,需要添加AddressBookUI.framework和AddressBook.framework两个框架,添加的地点这里就不在赘述了.在控制器内部首先import两个头文件,<AddressBook/AddressBook.h> 和 <

iOS通过app读取通讯录信息(整理)

iOS通过app读取通讯录信息,读取通讯录信息时需要加载AddressBookUI 和AddressBook两个包,并且引入头文件 #import <AddressBook/AddressBook.h> #import <AddressBookUI/AddressBookUI.h> 具体实现如下: -(void)readAllPeoples { //定义通讯录名字为addressbook ABAddressBookRef tmpAddressBook = nil; //根据系统版本

Python创建二维码通讯录

参考文档: Python二维码生成库qrcode安装和使用示例:http://www.jb51.net/article/58579.htm vCard格式参数详细说明:http://www.phpin.net/thread-280-1-1.html 二维码生成工具:http://tools.jb51.net/transcoding/jb51qrcode 准备环境: 系统版本:CentOS release 6.5 安装pip:yum install python-pip 安装qrcode: pip

iOS之iPhone手机通讯录和短信搜索界面的实现以及UISearchController和UISearchDisplayController的浅析

本来觉得这个模块也就是一个SearchBar就搞定了,但是现在的产品经理也是够了,一会儿一个想法,之前的搜索 都已经写完了,类似主流的电商,好像也没那么麻烦,但是改版了总得弄点什么吧.嘿,哥们,我现在要iphone手机 通讯录里面搜索的样式,你搞定哦......,要一毛一样哦.作为一个文化人,我只能在内心深处生 出表达出,苦逼的我们顶多发发牢骚,要改就改喽. 请看图先 这是他要的效果demo 下面是我写的demo 看到这效果,应该都能想到用UISearchController,但是这货是iOS8

iOS 硬件授权检测:定位服务、通讯录、日历、提醒事项、照片、蓝牙共享、麦克风、相机等(转)

转载自:http://www.cocoachina.com/ios/20151214/14502.html iOS系统版本的不断升级的前提,伴随着用户使用设备的安全性提升,iOS系统对于App需要使用的硬件限制也越来越严格,App处理稍有不妥,轻则造成功能不可用用户还不知道,重则会造成App Crash. 当 用户在App启动时,看到弹出来的一条条“XXX 请求访问您的位置” “XXX 请求访问您的通讯录” “XXX 请求访问您的日历” “XXX 请求访问您的摄像头” 等一系列消息时,用户觉得不

多功能电子通讯录(涉及到了双向链表的使用,Linux文件编程等等)

readme.txt //作为一个程序员,我们咋么能不写用户手册呢!MSP的我觉得用户体验是王道,苹果手机的用户体验的确不错!不过WP加油!我去,扯远了!赶紧看我的程序吧!  歡迎使用多功能電子通訊錄V1.0版本        如有BUG敬請原諒     make  之後便可以使用     ./ebook  運行本程序     make clean 清理本程序中間文件     make cleanall 清除所有非源程序文件 PS:我本想直接给大家看代码的,但是在这个过程中,重要不仅仅是代码,首

手机通讯录恢复

前段时间我哥备份手机通讯录备份的是xls表格格式,然后现在导入不进去了,用各种软件都是错误.我导出为vcard的(后缀是vcf),以文本格式打开看了下,发现vcard是很有格式规范的,顿时觉得有戏了.可以尝试将excel表格转换成vcard格式,然后导入. BEGIN:VCARD N:;移动客服;;;;;; TEL;CELL:10086 STARRED:False UID:514 VERSION:3.0 REV:20140602 END:VCARD 很明显的格式,第二行就是姓名,tel那一行就是

通讯录-第三版

第一版中: 我们开辟了一个有1000个元素的结构体数组来保存通讯录的信息,这种方式有一个缺点,当通讯录中存储的联系人比较少时会造成内存资源的浪费. 第二版中: 我们采用动态内存的方式去开辟数组,并且根据联系人个数的增加,而不断的增长这块存储空间,这样就避免了内存浪费的现象.但是这个版本还是有一些问题,就是当程序运行起来保存的信息到程序结束就被销毁,下一次程序运行起来的时候我们又要重新输入. 为此我们引入第三个版本,使用文件的方式去保存这些信息.当程序运行起来时,会自动从文件中读取这些信息并加载到