Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS获取通讯录联系人信息

iOS获取通讯录联系人信息

原创
作者头像
用户8983410
修改于 2021-10-29 02:45:19
修改于 2021-10-29 02:45:19
1.7K00
代码可运行
举报
运行总次数:0
代码可运行

IOS关于通讯录的开发有两种,一种是直接调用系统的通讯录界面,根据回调信息处理数据,另一种是直接获取系统的通讯录,完全自定义UI,并且可以通过官方给我们提供的接口进行读写。这篇博客主要讨论第二种方式。

IOS获取系统通讯录联系人信息

一、权限注册

随着apple对用户隐私的越来越重视,IOS系统的权限设置也更加严格,在获取系统通讯录之前,我们必须获得用户的授权。权限申请代码示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    //这个变量用于记录授权是否成功,即用户是否允许我们访问通讯录
    int __block tip=0;
    //声明一个通讯簿的引用
    ABAddressBookRef addBook =nil;
    //因为在IOS6.0之后和之前的权限申请方式有所差别,这里做个判断
    if ([[UIDevice currentDevice].systemVersion floatValue]>=6.0) {
        //创建通讯簿的引用
        addBook=ABAddressBookCreateWithOptions(NULL, NULL);
        //创建一个出事信号量为0的信号
        dispatch_semaphore_t sema=dispatch_semaphore_create(0);
        //申请访问权限
        ABAddressBookRequestAccessWithCompletion(addBook, ^(bool greanted, CFErrorRef error)        {
            //greanted为YES是表示用户允许,否则为不允许
            if (!greanted) {
                tip=1;
            }
            //发送一次信号
            dispatch_semaphore_signal(sema);
        });
        //等待信号触发
         dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    }else{
        //IOS6之前
        addBook =ABAddressBookCreate();
    }
    if (tip) {
    //做一个友好的提示
        UIAlertView * alart = [[UIAlertView alloc]initWithTitle:@"温馨提示" message:@"请您设置允许APP访问您的通讯录\nSettings>General>Privacy" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
        [alart show];
        return;
    }

几点注意:1、dispatch_semaphore_t三个相关的操作为

                           dispatch_semaphore_create 创建一个信号                  dispatch_semaphore_signal 发送一个信号                   dispatch_semaphore_wait               等待信号触发    

                             dispatch_semaphore_create()创建一个信号,后面可以跟一个参数,表示信号量,当信号量正值时,dispatch_semaphore_wait后面的代码会被执行,否则程序将会一直等待在dispatch_semaphore_wait。 dispatch_semaphore_signal的作用是发送一个信号,会使信号量加1,相对的,dispatch_semaphore_wait执行后会使信号量减1.

                  2、因为是否被授权是在ABAddressBookRequestAccessWithCompletion的block回调中获取的,所以我们需要在外面做一个线程等待。

二、获取通讯录联系人详细信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    //获取所有联系人的数组
    CFArrayRef allLinkPeople = ABAddressBookCopyArrayOfAllPeople(addBook);
    //获取联系人总数
    CFIndex number = ABAddressBookGetPersonCount(addBook);
    //进行遍历
    for (NSInteger i=0; i<number; i++) {
        //获取联系人对象的引用
        ABRecordRef  people = CFArrayGetValueAtIndex(allLinkPeople, i);
        //获取当前联系人名字
        NSString*firstName=(__bridge NSString *)(ABRecordCopyValue(people, kABPersonFirstNameProperty));
        //获取当前联系人姓氏
        NSString*lastName=(__bridge NSString *)(ABRecordCopyValue(people, kABPersonLastNameProperty));
        //获取当前联系人中间名
        NSString*middleName=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonMiddleNameProperty));
        //获取当前联系人的名字前缀
        NSString*prefix=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonPrefixProperty));
        //获取当前联系人的名字后缀
        NSString*suffix=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonSuffixProperty));
        //获取当前联系人的昵称
        NSString*nickName=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonNicknameProperty));
        //获取当前联系人的名字拼音
        NSString*firstNamePhoneic=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonFirstNamePhoneticProperty));
        //获取当前联系人的姓氏拼音
        NSString*lastNamePhoneic=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonLastNamePhoneticProperty));
        //获取当前联系人的中间名拼音
        NSString*middleNamePhoneic=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonMiddleNamePhoneticProperty));
        //获取当前联系人的公司
        NSString*organization=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonOrganizationProperty));
        //获取当前联系人的职位
        NSString*job=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonJobTitleProperty));
        //获取当前联系人的部门
        NSString*department=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonDepartmentProperty));
        //获取当前联系人的生日
        NSString*birthday=(__bridge NSDate*)(ABRecordCopyValue(people, kABPersonBirthdayProperty));
        NSMutableArray * emailArr = [[NSMutableArray alloc]init];
        //获取当前联系人的邮箱 注意是数组
        ABMultiValueRef emails= ABRecordCopyValue(people, kABPersonEmailProperty);
        for (NSInteger j=0; j<ABMultiValueGetCount(emails); j++) {
            [emailArr addObject:(__bridge NSString *)(ABMultiValueCopyValueAtIndex(emails, j))];
        }
        //获取当前联系人的备注
       NSString*notes=(__bridge NSString*)(ABRecordCopyValue(people, kABPersonNoteProperty));
       //获取当前联系人的电话 数组
        NSMutableArray * phoneArr = [[NSMutableArray alloc]init];
        ABMultiValueRef phones= ABRecordCopyValue(people, kABPersonPhoneProperty);
        for (NSInteger j=0; j<ABMultiValueGetCount(phones); j++) {
            [phonerr addObject:(__bridge NSString *)(ABMultiValueCopyValueAtIndex(phones, j))];
        }
        //获取创建当前联系人的时间 注意是NSDate
        NSDate*creatTime=(__bridge NSDate*)(ABRecordCopyValue(people, kABPersonCreationDateProperty));
        //获取最近修改当前联系人的时间
        NSDate*alterTime=(__bridge NSDate*)(ABRecordCopyValue(people, kABPersonModificationDateProperty));
        //获取地址
        ABMultiValueRef address = ABRecordCopyValue(people, kABPersonAddressProperty);
        for (int j=0; j<ABMultiValueGetCount(address); j++) {
            //地址类型
            NSString * type = (__bridge NSString *)(ABMultiValueCopyLabelAtIndex(address, j));
            NSDictionary * temDic = (__bridge NSDictionary *)(ABMultiValueCopyValueAtIndex(address, j));
            //地址字符串,可以按需求格式化
            NSString * adress = [NSString stringWithFormat:@"国家:%@\n省:%@\n市:%@\n街道:%@\n邮编:%@",[temDic valueForKey:(NSString*)kABPersonAddressCountryKey],[temDic valueForKey:(NSString*)kABPersonAddressStateKey],[temDic valueForKey:(NSString*)kABPersonAddressCityKey],[temDic valueForKey:(NSString*)kABPersonAddressStreetKey],[temDic valueForKey:(NSString*)kABPersonAddressZIPKey]];
        }
        //获取当前联系人头像图片
        NSData*userImage=(__bridge NSData*)(ABPersonCopyImageData(people));
        //获取当前联系人纪念日
        NSMutableArray * dateArr = [[NSMutableArray alloc]init];
        ABMultiValueRef dates= ABRecordCopyValue(people, kABPersonDateProperty);
        for (NSInteger j=0; j<ABMultiValueGetCount(dates); j++) {
            //获取纪念日日期
            NSDate * data =(__bridge NSDate*)(ABMultiValueCopyValueAtIndex(dates, j));
            //获取纪念日名称
            NSString * str =(__bridge NSString*)(ABMultiValueCopyLabelAtIndex(dates, j));
            NSDictionary * temDic = [NSDictionary dictionaryWithObject:data forKey:str];
            [dateArr addObject:temDic];
        }

一点扩展:相同的方法,可以获取关联人信息,社交信息,邮箱信息,各种类型的电话信息,字段如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 //相关人,组织字段
const ABPropertyID kABPersonKindProperty; 
const CFNumberRef kABPersonKindPerson;
const CFNumberRef kABPersonKindOrganization;

// 电话相关字段
AB_EXTERN const ABPropertyID kABPersonPhoneProperty;
AB_EXTERN const CFStringRef kABPersonPhoneMobileLabel;
AB_EXTERN const CFStringRef kABPersonPhoneIPhoneLabel 
AB_EXTERN const CFStringRef kABPersonPhoneMainLabel;
AB_EXTERN const CFStringRef kABPersonPhoneHomeFAXLabel;
AB_EXTERN const CFStringRef kABPersonPhoneWorkFAXLabel;
AB_EXTERN const CFStringRef kABPersonPhoneOtherFAXLabel
AB_EXTERN const CFStringRef kABPersonPhonePagerLabel;

// 即时聊天信息相关字段
AB_EXTERN const ABPropertyID kABPersonInstantMessageProperty;    
AB_EXTERN const CFStringRef kABPersonInstantMessageServiceKey;    
AB_EXTERN const CFStringRef kABPersonInstantMessageServiceYahoo;
AB_EXTERN const CFStringRef kABPersonInstantMessageServiceJabber;
AB_EXTERN const CFStringRef kABPersonInstantMessageServiceMSN;
AB_EXTERN const CFStringRef kABPersonInstantMessageServiceICQ;
AB_EXTERN const CFStringRef kABPersonInstantMessageServiceAIM;
AB_EXTERN const CFStringRef kABPersonInstantMessageServiceQQ 
AB_EXTERN const CFStringRef kABPersonInstantMessageServiceGoogleTalk;
AB_EXTERN const CFStringRef kABPersonInstantMessageServiceSkype;
AB_EXTERN const CFStringRef kABPersonInstantMessageServiceFacebook;
AB_EXTERN const CFStringRef kABPersonInstantMessageServiceGaduGadu;
AB_EXTERN const CFStringRef kABPersonInstantMessageUsernameKey; 

// 个人网页相关字段
AB_EXTERN const ABPropertyID kABPersonURLProperty;
AB_EXTERN const CFStringRef kABPersonHomePageLabel; 
//相关人姓名字段
AB_EXTERN const ABPropertyID kABPersonRelatedNamesProperty;   
AB_EXTERN const CFStringRef kABPersonFatherLabel;    // Father
AB_EXTERN const CFStringRef kABPersonMotherLabel;    // Mother
AB_EXTERN const CFStringRef kABPersonParentLabel;    // Parent
AB_EXTERN const CFStringRef kABPersonBrotherLabel;   // Brother
AB_EXTERN const CFStringRef kABPersonSisterLabel;    // Sister
AB_EXTERN const CFStringRef kABPersonChildLabel;      // Child
AB_EXTERN const CFStringRef kABPersonFriendLabel;    // Friend
AB_EXTERN const CFStringRef kABPersonSpouseLabel;    // Spouse
AB_EXTERN const CFStringRef kABPersonPartnerLabel;   // Partner
AB_EXTERN const CFStringRef kABPersonAssistantLabel; // Assistant
AB_EXTERN const CFStringRef kABPersonManagerLabel;   // Manager

三、通讯录“写”的相关操作

看到上面读取信息的代码,你可能觉得一阵目炫,其实只是字段比较长,逻辑还是很简单的,同样,写的操作与之类似,创建,修改,删除,是我们对通讯录“写”的常用操作。

1、创建一个联系人
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    //创建一个联系人引用
    ABRecordRef person = ABPersonCreate();
    NSString *firstName = @"哈";
    NSString *lastName = @"哈";
    // 电话号码数组
    NSArray *phones = [NSArray arrayWithObjects:@"123",@"456",nil];
    // 电话号码对应的名称
    NSArray *labels = [NSArray arrayWithObjects:@"iphone",@"home",nil];
    //这里的字段和上面的字段完全相同
    // 设置名字属性
    ABRecordSetValue(person, kABPersonFirstNameProperty,(__bridge CFStringRef)firstName, NULL);
    // 设置姓氏属性
    ABRecordSetValue(person, kABPersonLastNameProperty, (__bridge CFStringRef)lastName, NULL);
    // 设置生日属性
    ABRecordSetValue(person, kABPersonBirthdayProperty,(__bridge CFDateRef)birthday, NULL);
    // 字典引用
    ABMultiValueRef dic =ABMultiValueCreateMutable(kABMultiStringPropertyType);
    // 添加电话号码与其对应的名称内容
    for (int i = 0; i < [phones count]; i ++) {
        ABMultiValueIdentifier obj = ABMultiValueAddValueAndLabel(dic,(__bridge CFStringRef)[phones objectAtIndex:i], (__bridge CFStringRef)[labels objectAtIndex:i], &obj);
    }
    // 设置phone属性
    ABRecordSetValue(person, kABPersonPhoneProperty, dic, NULL);
    // 将新建的联系人添加到通讯录中
    ABAddressBookAddRecord(addBook, person, NULL);
    // 保存通讯录数据
    ABAddressBookSave(addBook, NULL);
2、修改联系人

修改联系人的操作就是将获取和添加和在一起,先获取到相应的联系人引用,重设其属性字段即可。

3.删除联系人
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     //获取所有联系人
     NSArray *array = (__bridge NSArray*)ABAddressBookCopyArrayOfAllPeople(addBook);
    // 遍历所有的联系人
    for (id obj in array) {
        ABRecordRef people = (__bridge ABRecordRef)obj;
        NSString *firstName = (__bridge NSString*)ABRecordCopyValue(people, kABPersonFirstNameProperty);
        NSString *lastName = (__bridge NSString*)ABRecordCopyValue(people, kABPersonLastNameProperty);
        if ([firstName isEqualToString:@"哈"] &&[lastName isEqualToString:@"哈"]) {
            ABAddressBookRemoveRecord(addBook, people,NULL);
        }
    }
    // 保存修改的通讯录对象
    ABAddressBookSave(addBook, NULL); 

四、重中之重-关于内存管理

上面的代码为了演示方便,创建的全部引用都没有释放,势必是造成内存泄露,在我们用ABAddressBookCreate()创建一个引用对象时,切记无论ARC还MRC,要用CFRelease()进行释放引用,例如上面的例子,我们需要加上这句代码

CFRelease(addBook);

如果你耐心的看到了这里,我想你一定明白了我为什么不在前边的代码里说明这个问题,因为在ARC项目普及的现在,这的确是重中之重。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
iOS保存联系人到系统通讯录
1、首先判断当前通讯录是否存在这个联系人 // 判断通讯录是否存在某个联系人 + (BOOL)isExistContactNameByName:(NSString *)contactName{ ABAddressBookRef addBook = nil; __block BOOL isExist = NO; CFErrorRef error = nil; addBook = ABAddressBookCreateWithOptions(NULL, &error)
czjwarrior
2018/05/28
1.3K0
iOS开发之AddressBook框架详解
    首先,AddressBook框架是一个已经过时的框架,iOS9之后官方提供了Contacts框架来进行用户通讯录相关操作。尽管如此,AddressBook框架依然是一个非常优雅并且使用方便的通讯录帮助库。本篇博客只要总结AddressBook框架的相关使用方法。
珲少
2018/09/20
1.7K0
iOS开发之AddressBook框架详解
demo3同通讯录展示的方式分组排序
按A-Z顺序分组展示 有些项目中会需要这样的需求。形成类似于上述的界面。类似于通讯录里边的排序。实现的效果:所有的数据展示的时候,能够分组展示。顺序按照A-Z的书序进行排列。如果不是以A-Z开头,则默认为#一列。 一般我们从服务器拿到的数据都是一个数组。里边包含了所有的数据。 思路:思路很重要!!! 我的思路详解:首先界面的话 1.需要组的名称。组的名称就是这些数据的首字母。所以说这里需要一个数组,来存储这个组的名字。sortedSectionTitles 2.就是每一组下边的数据的排序了。针对这个
用户1219438
2018/02/01
9010
demo3同通讯录展示的方式分组排序
ios 开发,通讯录信息调用常用方法,这个比较全,不用再整理了
ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef results = ABAddressBookCopyArrayOfAllPeople(addressBook); for(int i = 0; i < CFArrayGetCount(results); i++) { ABRecordRef person = CFArrayGetValueAtIndex(results, i)
猿人谷
2018/01/17
7100
iOS开发之CFHttpMessageRef的那些坑
在上一篇文章iOS开发之NSURLProtocol的那些坑中,介绍了一些NSURLProtocol使用过程中可能遇到的问题,今天我们就接着说CFHttpMessageRef。 或许你还没用过CFHttpMessageRef,应该说还没遇到需要使用这个的场景,当然,老司机就另当别论了。这是个iOS系统中非常底层的网络通讯接口,已经接近于UNIX系统的socket通信了,使用CFHttpMessageRef进行HTTP连接的好处就是控制的粒度更细了,例如你可以设置SSL连接的PeerName,证书验证的方式,还
forrestlin
2018/05/24
2.3K0
iOS---小经验分享
1.字符串在block中得赋值 定义一个全局变量,《字符串》当这个字符串用copy修饰的时候,然后再在block中赋值,当在block块之外访问时,不能得到字符创的值。此时字符串应该设置为strong。 在block中修改局部变量的值 此变量需要用__block修饰 1.字符串在block中得赋值 定义一个全局变量,《字符串》当这个字符串用copy修饰的时候,然后再在block中赋值,当在block块之外访问时,不能得到字符串的值,此时的字符串可能已经被释放,解决办法字符串应该用strong修饰。 @in
用户1941540
2018/05/11
6630
iOS 通讯录相关序一、介绍二、弹出系统通讯录程序三、代理方法四、不需要弹出联系人控制器就可以获取联系人信息的方法五、iOS 9 新出的点击通讯录的获取信息的办法
序 在简书写了一个月的blog,开始只是简单的将自己之前的笔记进行CCVV模式(command+c/v),渐渐地已经摸索出更多的套路,比如多写些demo,多加些配图,较多的知识点用思维导图做索引,markdown的语法也更加娴熟,每次整理都重新复习了下之前的知识点,也尽量让自己的思路让别人理解,所以觉得写blog还是一个比较好的习惯的,也感谢简书上这么多朋友关注,也是我继续写下去的动力,大家一起努力成为大神! ---- 一、介绍 1.在iOS中,有2个框架可以访问用户的通讯录: AddressBook
用户2141756
2018/05/18
1.9K0
数据结构项目实战——通讯录
C语言通讯录是一个使用C语言编写的简单程序,用于存储和管理联系人信息。该程序允许用户添加、删除、查找和显示通讯录中的联系人。每个联系人通常包括姓名、电话号码和电子邮件地址等基本信息。程序使用结构体来存储联系人信息,并使用数组或链表等数据结构来组织和管理通讯录。通过命令行界面与用户进行交互,用户可以通过输入命令来执行相应的操作。C语言通讯录程序可以用于个人或小型组织的信息管理,提高联系人信息的管理效率。
鲜于言悠
2024/03/20
2830
【C】—文件版本通讯录的实现
在前面的文章中,已经讲解了动态版本的通讯录的实现,但是动态通讯录存在一个致命缺陷,就是它不能自动保存数据,而前面一篇文章中学到了数据持久化的方法之一:即把数据存放在磁盘文件上,便可以实现数据持久化。 具体应该如何做呢? 假如我们在退出的时候,通过文件操作,把我们所写的数据存在磁盘文件里,然后我们再进行下一次的使用的时候,在初始化阶段就从磁盘中读取这些数据,这不就实现了。
诺诺的包包
2023/02/20
5990
YYModel 源码剖析:关注性能
json与模型的转换框架很多,YYModel 一出,性能吊打同类组件,终于找了些时间观摩了一番,确实收益颇多,写下此文作为分享。
波儿菜
2018/06/19
2.2K0
C语言通讯录(静态&动态&文件操作/内附源码)
目录 前言 问题描述 工具 基本框架 静态通讯录 具体实现思路与流程 准备阶段 创建联系人信息与通讯录结构体 主体 菜单界面 通讯录各功能实现 初始化通讯录(清空通讯录联系人) 添加通讯录联系人 删除通讯录联系人 查找通讯录联系人 修改联系人信息 展示通讯录联系人 排序通讯录联系人 整体效果图 附上源码 动态通讯录 通讯录结构 初始化通讯录 通讯录增容 通讯录销毁 数据保存 输出数据 输入数据(加载数据) 附上源码 ---- 前言 ---- 检验学习成果最好的方式是实践 在学习完C语言的基础知识以后
用户9645905
2022/11/30
9740
C语言通讯录(静态&动态&文件操作/内附源码)
通讯录的实现(详解)
通讯录的信息已经在contact.h定义好,我们需要在test.c创建并且给它初始化
用户11369558
2024/11/20
1460
通讯录的实现(详解)
iOS 获取通讯录里边的电话号码AddressBook
1  首先导入库 <AddressBook/AddressBook.h> 2 然后在导入#import <AddressBook/AddressBook.h>文件 3 声明  @property (nonatomic,assign) ABAddressBookRef addressBook;//电话簿   并进行初始化   self.addressBook = ABAddressBookCreateWithOptions(NULL, NULL); 4 然后进行获取通讯录的操作 ABAddressBookRe
用户1219438
2018/02/01
1.2K0
【C版本】静态通讯录与动态通讯录的实现,以及各自所存在的缺陷对比。(含所有原码)
与之前的扫雷以及三子棋的实现方式是一样的,创建两个源文件,一个用来测试,一个用来存放函数定义,再创建一个头文件,用来存放函数声明。接下来是着手实现通讯录。 首先要有一个大概的框架,并且要明确即将实现的通讯录的功能,最基本的即增删查改,然后对这些功能进行进一步的细化实现,并且我们知道,人的信息是一个比较复杂的对象,不可能用一句话就概括,所以就用到了之前学过的结构体,一个结构体用来存放联系人,另一个用来存放联系人对应的的基本信息。 最后我们要知道一点,就是一口吃不成一个大胖子,功能实现的过程是一步步来的。
诺诺的包包
2023/02/20
4440
手把手教你写通讯录(含动态版)
思路有了,那么我们先来打一个框架 先用printf实现一个菜单 这个菜单可以帮助我们更方便地使用通讯录,可理解为指引功能。接着,功能的选择,我们可以用switch实现 其次,这个通讯录,我们想让它一直进行下去,直到使用者不想用了,所以写一个循环 综上所述,代码实现我们可以写成这般
大海里的番茄
2024/01/19
2560
手把手教你写通讯录(含动态版)
RunLoop在iOS开发中的应用
RunLoop在iOS开发中的应用范围并没有像runtime 那样广泛,我们通过CFRuntime的源代码可知runloop跟线程的是密不可分的,一个线程一定会创建一个对应的runloop,只是主线程创建就自动run了,而子线程只会创建不会自动run。苹果线程管理 Thread Management也说了在线程中利用runloop,
羊羽shine
2019/05/29
2K0
模拟实现通讯录
生活中我们肯定会用到通讯录的,通讯录中会存放了我们认识人的联系方式,姓名,家庭住址等等。 那么一个通讯录它最基础应该有那些功能呢?
Yui_
2024/10/16
1490
通讯录的实现
ljw695
2024/10/18
1560
c语言实现通讯录
本次通讯录采用 结构体数组 存储 联系人 数据. 结构体数组 的每个成员保存着联系人的具体信息特征. 用一个参数 sz 记录当前联系人个数.
初阶牛
2023/04/03
1K0
c语言实现通讯录
【C语言】通讯录实现(上)
大耳朵土土垚
2024/03/13
1690
推荐阅读
相关推荐
iOS保存联系人到系统通讯录
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验