项目介绍:
联系人信息:
姓名、性别、联系电话
功能:
1、添加联系人
2、删除联系人
3、修改联系人信息
4、查询联系人
5、显示所有联系人
6、该通讯录最多只存储100个联系人
#include <stdio.h>
#include <getch.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
// 通用的工具函数
void clear_stdin(void)
{
stdin->_IO_read_ptr = stdin->_IO_read_end;
}
char* get_str(char* str,size_t size)
{
clear_stdin();
size_t len = strlen(fgets(str,size,stdin));
if('\n' == str[len-1])
str[len-1] = '\0';
clear_stdin();
}
void put_str(const char* msg,float sec)
{
printf("%s\n",msg);
usleep(1000000*sec);
}
char get_cmd(char start,char end)
{
clear_stdin();
printf("---------------------------\n");
printf("请输入指令[%c,%c]:",start,end);
for(;;)
{
char cmd = getch();
if(start <= cmd && cmd <= end)
{
printf("%c\n",cmd);
return cmd;
}
}
}
bool yes_or_no(const char* msg)
{
clear_stdin();
printf("%s(y/n)?\n",msg);
for(;;)
{
char cmd = getch();
if('y' == cmd || 'Y' == cmd)
return true;
if('n' == cmd || 'N' == cmd)
return false;
}
}
void anykey_continue(void)
{
clear_stdin();
printf("按任意键继续...\n");
getch();
}
// 通讯录专用的函数
const char* sex_to_str(char sex)
{
switch(sex)
{
case 'w':
case 'W':
return "女";
case 'm':
case 'M':
return "男";
default:
return "狗";
}
}
char get_sex(void)
{
clear_stdin();
printf("请输入性别(w女/m男):");
for(;;)
{
char sex = getch();
if('w' == sex || 'W' == sex || 'm' == sex || 'M' == sex)
{
printf("%s\n",sex_to_str(sex));
return sex;
}
}
}
char menu(void)
{
system("clear");
puts("***欢迎使用电子通讯录***");
puts("1、添加 2、删除");
puts("3、修改 4、查询");
puts("5、遍历 6、退出");
return get_cmd('1','6');
}
char name[100][20];
char sex [100];
char phone[100][12];
size_t cnt;
float msg_show_sec = 1.5;
void add(void)
{
char cmd;
do{
if(cnt >= 100)
{
put_str("通讯录已满!",msg_show_sec);
return;
}
printf("请输入姓名:");
get_str(name[cnt],sizeof(name[0]));
sex[cnt] = get_sex();
printf("请输入电话:");
get_str(phone[cnt],sizeof(phone[0]));
bool flag = true;
for(int i=0; i<cnt; i++)
{
if(!strcmp(phone[i],phone[cnt]))
{
flag = false;
break;
}
}
cnt += flag;
if(flag)
printf("添加联系人成功,");
else
printf("该电话已存在,添加联系人失败,");
cmd = yes_or_no("是否继续");
}while(cmd);
put_str("结束添加!",msg_show_sec);
}
int query(const char* key)
{
for(int i=0; i<cnt; i++)
{
if(!strcmp(phone[i],key))
return i;
}
return -1;
}
void del(void)
{
char key[12];
printf("请输入要删除的联系人电话:");
get_str(key,sizeof(key));
int index = query(key);
if(-1 == index)
{
put_str("未找到该联系人,无法删除!",msg_show_sec);
return;
}
cnt--;
strcpy(name[index],name[cnt]);
strcpy(phone[index],phone[cnt]);
sex[index] = sex[cnt];
put_str("删除联系人成功!",msg_show_sec);
}
void mod(void)
{
}
void find(void)
{
char key[20];
printf("请输入要查询的关键字:");
get_str(key,sizeof(key));
bool flag = false;
for(int i=0; i<cnt; i++)
{
if(strstr(name[i],key) || strstr(phone[i],key))
{
printf("%s %s %s\n",name[i],sex_to_str(sex[i]),phone[i]);
flag = true;
}
}
if(flag)
anykey_continue();
else
put_str("该关键字未查询到联系人!",msg_show_sec);
}
void show(void)
{
if(0 == cnt)
{
put_str("暂无联系人!",msg_show_sec);
return;
}
for(int i=0; i<cnt; i++)
{
printf("%s %s %s\n",name[i],sex_to_str(sex[i]),phone[i]);
}
anykey_continue();
}
void save(void)
{
FILE* fp = fopen("data.txt","w");
if(NULL == fp)
{
puts("保存数据失败!");
return;
}
for(int i=0; i<cnt; i++)
{
fprintf(fp,"%s %c %s\n",name[i],sex[i],phone[i]);
}
printf("成功保存 %d 条数据!\n",cnt);
fclose(fp);
}
void load(void)
{
FILE* fp = fopen("data.txt","r");
if(NULL == fp)
{
puts("加载数据失败!");
return;
}
int ret = 0;
do{
ret = fscanf(fp,"%s %c %s",name[cnt],&sex[cnt],phone[cnt]);
}while(3 == ret && ++cnt);
printf("成功加载 %d 条数据!\n",cnt);
fclose(fp);
}
int main(int argc,const char* argv[])
{
load();
for(;;)
{
switch(menu())
{
case '1':
add();
break;
case '2':
del();
break;
case '3':
mod();
break;
case '4':
find();
break;
case '5':
show();
break;
case '6':
save();
return 0;
}
}
}