知识储备
字符串相关操作函数:
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;
}