7-1 通讯录的录入与显示

本文介绍了一个简单的通讯录管理程序的设计与实现。程序能够录入并显示指定的联系人信息,包括姓名、生日、性别及电话号码等。通过输入特定指令,用户可以查询存储在通讯录中的联系人详情。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

7-1 通讯录的录入与显示(10 分)
通讯录中的一条记录包含下述基本信息:朋友的姓名、出生日期、性别、固定电话号码、移动电话号码。 本题要求编写程序,录入N条记录,并且根据要求显示任意某条记录。
输入格式:

输入在第一行给出正整数N(≤10);随后N行,每行按照格式姓名 生日 性别 固话 手机给出一条记录。其中姓名是不超过10个字符、不包含空格的非空字符串;生日按yyyy/mm/dd的格式给出年月日;性别用M表示“男”、F表示“女”;固话和手机均为不超过15位的连续数字,前面有可能出现+。
在通讯录记录输入完成后,最后一行给出正整数K,并且随后给出K个整数,表示要查询的记录编号(从0到N−1顺序编号)。数字间以空格分隔。
输出格式:

对每一条要查询的记录编号,在一行中按照姓名 固话 手机 性别 生日的格式输出该记录。若要查询的记录不存在,则输出Not Found。
输入样例:

3
Chris 1984/03/10 F +86181779452 13707010007
LaoLao 1967/11/30 F 057187951100 +8618618623333
QiaoLin 1980/01/01 M 84172333 10086
2 1 7
输出样例:

LaoLao 057187951100 +8618618623333 F 1967/11/30
Not Found

#include<stdio.h>
  struct people{
    char name[20],s[20],g[20],c[20],x[20];
  };
  int main(){
  int n,i,a,b[20];
  scanf("%d",&n);
  struct people p[20];
  for(i=0;i<n;i++){
    scanf("%s %s %s %s %s"
    ,p[i].name
    ,p[i].s
    ,p[i].x
    ,p[i].g
    ,p[i].c);
    }
  scanf("%d",&a);
  for(i=0;i<a;i++){
    scanf("%d",&b[i]);
  }
  for(i=0;i<a;i++){
    if(b[i]>=0&&b[i]<n){
      printf("%s %s %s %s %s\n"
      ,p[b[i]].name
      ,p[b[i]].g
      ,p[b[i]].c
      ,p[b[i]].x
      ,p[b[i]].s);
    }
    else
      printf("Not Found\n");
  }
  return 0;
}
<think>嗯,用户想知道如何用C语言实现通讯录录入显示功能。首先,我需要回忆一下C语言的基本结构,特别是结构体和文件操作的部分。通讯录通常需要存储联系人信息,比如姓名、电话、地址等,所以应该用结构体来定义每个联系人的数据结构。 接下来,录入功能需要用户输入信息并保存。可能需要一个函数来处理输入,比如AddContact函数。显示功能则是遍历存储的联系人并打印出来,对应的ShowContact函数。动态内存管理可能也是一个问题,因为通讯录的大小可能会变化,所以应该用动态数组或者链表来存储。不过用户提到的示例引用中有静态和动态版本,这里可能需要先展示静态版本,再考虑动态分配。 然后,文件操作部分。用户引用的资料提到,程序启动时加载文件,退出时保存。所以需要函数来读取和写入文件,比如LoadContact和SaveContact。用fopen打开文件,fread和fwrite进行读写,记得检查文件指针是否为空,避免程序崩溃。 另外,代码结构方面,可能需要分文件编写,比如contact.h声明结构体和函数,contact.c实现函数,test.c作为主程序。但用户可能希望一个简化的示例,所以先给出一个完整的单文件示例,方便理解。 还要注意输入缓冲区的处理,比如在读取字符串前使用getchar()清空缓冲区,防止换行符被误读。在显示联系人时,循环遍历数组,并判断count是否为零,给出提示信息。 测试的时候,主函数里用循环和switch语句处理用户选择,1为添加,2为显示,3退出,并在退出时保存数据。需要确保每次添加联系人时检查数组是否已满,避免溢出。 可能的问题点:文件路径的处理,动态内存分配是否足够,输入错误处理等。但根据用户的问题,可能不需要太复杂,先保证基本功能正确。 最后,示例代码要符合C语言的语法,结构清晰,注释明确,方便用户理解。之后生成相关问题,比如动态内存版本、文件存储位置修改、数据验证等,帮助用户深入学习。</think>### C语言通讯录录入显示功能实现步骤 根据文件存储和动态内存管理需求,以下为实现通讯录基础功能的完整代码示例(基于动态内存版本): ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NAME 20 #define MAX_TEL 12 #define INIT_SIZE 3 typedef struct Contact { char name[MAX_NAME]; char tel[MAX_TEL]; int age; } Contact; typedef struct ContactList { Contact* data; int count; int capacity; } ContactList; // 初始化通讯录 void InitContact(ContactList* pc) { pc->data = (Contact*)malloc(INIT_SIZE * sizeof(Contact)); pc->count = 0; pc->capacity = INIT_SIZE; } // 扩容检查 void CheckCapacity(ContactList* pc) { if (pc->count == pc->capacity) { Contact* new = (Contact*)realloc(pc->data, (pc->capacity + 2) * sizeof(Contact)); if (new) { pc->data = new; pc->capacity += 2; printf("扩容成功,当前容量:%d\n", pc->capacity); } } } // 添加联系人 void AddContact(ContactList* pc) { CheckCapacity(pc); printf("请输入姓名:"); scanf("%s", pc->data[pc->count].name); printf("请输入电话:"); scanf("%s", pc->data[pc->count].tel); printf("请输入年龄:"); scanf("%d", &pc->data[pc->count].age); pc->count++; } // 显示通讯录 void ShowContact(const ContactList* pc) { if (pc->count == 0) { printf("通讯录为空\n"); return; } printf("%-10s\t%-12s\t%-5s\n", "姓名", "电话", "年龄"); for (int i = 0; i < pc->count; i++) { printf("%-10s\t%-12s\t%-5d\n", pc->data[i].name, pc->data[i].tel, pc->data[i].age); } } // 保存到文件 void SaveContact(ContactList* pc) { FILE* pf = fopen("contact.dat", "wb"); if (!pf) { perror("SaveContact"); return; } fwrite(pc->data, sizeof(Contact), pc->count, pf); fclose(pf); } // 加载文件数据 void LoadContact(ContactList* pc) { FILE* pf = fopen("contact.dat", "rb"); if (!pf) { perror("LoadContact"); return; } Contact tmp; while (fread(&tmp, sizeof(Contact), 1, pf)) { CheckCapacity(pc); pc->data[pc->count++] = tmp; } fclose(pf); } int main() { ContactList con; InitContact(&con); LoadContact(&con); int input = 0; do { printf("\n1.添加\t2.显示\t3.退出\n"); printf("请选择:"); scanf("%d", &input); switch(input) { case 1: AddContact(&con); break; case 2: ShowContact(&con); break; case 3: SaveContact(&con); printf("数据已保存\n"); break; default: printf("输入错误\n"); } } while (input != 3); free(con.data); return 0; } ``` 关键实现要点: 1. 使用动态内存管理(`malloc/realloc`)实现弹性存储容量[^3] 2. 通过二进制文件读写(`fwrite/fread`)实现持久化存储[^4] 3. 包含扩容机制防止数据溢出 4. 采用模块化设计便于功能扩展
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值