栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c语言基础 通讯录项目 最详细 封装strcmp,strncmp,strlen,strcpy函数

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c语言基础 通讯录项目 最详细 封装strcmp,strncmp,strlen,strcpy函数

目录

一 .总览。

1. tongxunlu.h文件

2.然后就是main.c文件

3.然后就是 tongxunlu.c  文件 

 4.最后makefile

二.菜单

三.函数调用

四.添加联系人

五,查看所有联系人 并按首字母排序

六.查找练习人

七.删除联系人

八.修改联系人信息

九.退出程序

十.strcmp 等 封装的4个函数


一 .总览。

有什么不够详细或者有问题的地方欢迎私信

封装的strcmp等 4个函数在本文最后面

该项目分四个文件 全程 无一指针 绝对够简单

main.c 
tongxunlu.c //所有的函数在此编写 封装
tongxunlu.h // 所有的函数在此进行声明  同时包含所需头文件
makefile //编译规则  当然不嫌麻烦的可以不用这个文件  

 初学 写的第一个项目 

先大概总览一下吧  每个文件作用吧

所有的分析都在注释里面 

 

1. tongxunlu.h文件

所有的函数声明在此

#ifndef _TONGXUN_H_ //防止重复声明     这是tongxunlu.h  文件
#define _TONGXUN_H_ //防止重复声明
#include
#include
#include

#define SIZE 100 //保存联系人的最大数量
 //结构体数组 联系人信息保存 
struct person       //定义一个全局变量  结构体数组
{                   // 可以避免传参问题 降低难度
    char name[32];
    int  age;
    char adress[32];
    int  tel;
};
struct person p[SIZE];//结构体数组

//下面使用的4个函数全为自己封装
//也可以直接包含#include
//直接调用
//mystrcpy
void mystrcpy(char *str,char *ptr);
//mystrlen
int mystrlen(char *str);
//mystrncmp
int my_strncmp(const char *str,const char *str1,int n);
//mystrcmp
int my_strcmp(const char *str,const char *str1);

void menu();//菜单

void myswitch();//子函数调用

void addinform();//添加联系人信息

void view_det();//查看所有联系人信息

void Find_person();//查找联系人

void  del_person();//删除联系人

void change_infor();//修改联系人信息

void endp();//退出程序


#endif//与开头作用相同

2.然后就是main.c文件
#include "tongxun.h"//头文件  所有函数声明在里面   这是main.c 文件内容

int main(int argc, char const *argv[])
{

    while (1)//这个循环可以实现 功能结束返回菜单
    {

        menu(); //菜单  

        myswitch(); //这里在tongxunlu.c封装好了也可直接在main.c里写

    }
    return 0;
}

3.然后就是 tongxunlu.c  文件 

所有的函数都在此编写 先看下图片吧  具体分析和源码在后面

 4.最后makefile

应该没有 更简单的了吧  当然不写也行

二.菜单

好了接下来详细介绍

//mymenu 菜单   第一个菜单  就不必多说了 全程printf打印

void menu()
{   
    printf("**************欢迎使用通讯录*****************n");
    printf("*********************************************n");
    printf("**  1.添加联系人              2.查看联系人 **n");
    printf("**  3.搜索联系人              4.删除联系人 **n");
    printf("**  5.修改用户信息            6.退出通讯录 **n");
    printf("*********************************************n");
    printf("*********************************************n");

}

三.函数调用

然后就是switch  case    输入数字调用对应函数实现对应功能

void myswitch()
{   
    int num;//定义整形 数字
    scanf("%d",&num); //输入数字 调用对应功能
    getchar();  //吞噬垃圾字符 防止出现错误
    while(1) //此处用循环可以为下面连续使用对应功能 
    {   
        switch (num)
        {             
            case 1:
            printf("正在添加联系人.....n");
            putchar(10);//没什么作用为了让终端显示的不那么拥挤
            addinform();//添加联系人函数调用
            break;
            case 2:
                printf("正在查看联系人.....n");
                putchar(10);
                view_det();//查看联系人函数调用
                break;
            case 3:
                printf("正在搜索联系人.....n");
                putchar(10);
                Find_person();//搜索联系人函数调用
                break;
            case 4:
                printf("正在删除联系人.....n");
                putchar(10);
                del_person();//删除联系人函数调用
                break;
            case 5:
                printf("正在修改联系人.....n");
                putchar(10);
                change_infor();//修改联系人函数调用
                break;
            case 6:
                printf("正在退出通讯录.....n");
                endp();//退出函数调用
                break;      
            default:
                printf("对不起您输入有误,请重新输入n");
                break;
        }
        break;  
    }
}

四.添加联系人

然后开始看第一个功能  详细的分析都用注释来解释  注释有点长 下个功能写短点

void addinform()
{
    printf("请输入姓名:n");
    scanf("%s",p[mm].name); //tongxunlu.h 定义了一个结构体数组 此处联系人信息全存在结构体数组中
                            //注意p[mm]  里面的 mm 很关键后面都要用到 tongxunlu.c最上面定义了一个全局变量int = 0  统计添加联系人的个数 
    printf("请输入年龄:n");//这里相当于 把输入信息存到p[0] 这个结构体里面
    
    scanf("%d",&p[mm].age);
    
    printf("请输入住址:n");
    scanf("%s",p[mm].adress);

    printf("请输入电话号码:n");

    scanf("%d",&p[mm].tel);
    putchar(10);

    printf("*****联系人添加完成*****n");

    mm++;                               //添加完成mm+1  下次再添加就是存到屁p[1]这个结构体里面了
    int num = 0;  
    printf("*请选择是否继续添加联系人*n");

    printf("*1.继续添加*    2.返回菜单*n");
    scanf("%d",&num);
    getchar();
    if(num == 1)
    {
        addinform();//继续添加就在此调用函数
    }  
    else
    {
        return;       //不添加就结束 把程序流程从被调函数转向主调函数    main.c在此循环进入菜单              
    }                        
        
}

五,查看所有联系人 并按首字母排序

第二个功能   //查看用户信息并按名字首字母进行排序

//查看用户信息并按名字首字母进行排序
void view_det()
{//这里采用冒泡排序  将添加的联系人按名字首字母进行排序  不强调的可以不用
    for(int j = 0;j < mm-1 ;j++)
    {
        for(int k = 0;k0 )  //这里就是strncmp函数  n=1 比较名字首字母大小
            {
                struct person tmp = p[k]; // 定义第三个变量也就一个结构体 进行交换
                                         //整个结构体进行交换省了很多麻烦
                p[k] = p[k+1];
                p[k+1] =  tmp;
            }
        }
    }

    for(int j =0;j < mm;j++) // 遍历  循环打印用户信息 mm为添加的练习人个数  第一个功能有介绍
    {
        printf("╔════════════════════════════════════════════════════════╗n");
        printf("*姓名%s__年龄:%d___住址:%s__电话%d*n",p[j].name,p[j].age,p[j].adress,p[j].tel);
        printf("╚════════════════════════════════════════════════════════╝n");
        putchar(10);
    }
}

六.查找练习人

第三个功能   按地址  或者姓名 查找联系人

//按地址  或者姓名 查找联系人
void Find_person()
{
    char s1[32]={0};//定义一个字符串数组 用于保存你输入想要查找联系人的名字
    while (1)
    {
        printf("********************************n");
        printf("请输入您所查找联系人的姓名或者住址n");
        printf("********************************n");
        int i;
        scanf("%s",s1);
        for(i= 0;i 

七.删除联系人

第四个功能  删除联系人

void  del_person()
{
    printf("**请输入你想删除联系人的名字**n");
    char s2[32] = {0};
    scanf("%s",s2);  //定义一个字符串数组保存 想要删除联系人的名字
                    // 下面注释掉的是判断是否存存联系人的结构体体是否为空 不够完善
    
    {   int n;
        for(n=0; n 

八.修改联系人信息

第五个功能修改联系人信息

void change_infor()   //修改用户信息

{
    printf("**请输入您所要修改信息的人名**n");
    char s3[32] = {0};
    scanf("%s",s3);

    int g;
    for(g=0;g < mm;g++)
    {
        if(my_strcmp(s3,p[g].name) == 0)  //遍历到你想要修改信息的哪个用户
        {                                  //strcmp 比较名字是否相同如果相同
            printf("请输入新的姓名n");//下面直接进行覆盖就行了
            scanf("%s",p[g].name);    //把新的信息覆盖旧的信息

            printf("请输入新的年龄n");
            scanf("%d",&p[g].age);

            printf("请输入新的住址n");
            scanf("%s",p[g].adress);

            printf("请输入新的电话n");

            scanf("%d",&p[g].tel);

            printf("修改成功n");
            return;  //修改完  返回主函数 循环进入菜单
        }
    }
    if(mm==g)  //如果一直没有遍历到  那么g==mm 也就是没有这个用户
    {
        printf("**对不起,您输入有误,未找到此联系人**n");
        putchar(10);
    }
}

九.退出程序

第六个工功能  这个没啥好说的直接结束进程

//退出程序
void endp()
{
    exit(0);//结束整个进程
}

如何调用函数  可以看看上面switch  case  输入对应数字执行对应函数

能力有限只能 这样了  第一次写的没有进行修改  可能有些地方可以进行删减  

然后就是 表达能力也就这样了  哈哈哈  有什么不了解的地方可以私信

十.strcmp 等 封装的4个函数

然后就是 4个封装好的函数 就放在下面

//mystrlen  计算字符串长度
int mystrlen(char *str)
{
    int i = 0;
    while( *str!='' )
    {
        str++;
        i++;
    }
    return i;
}
//mystrcpy  字符串覆盖 后面的覆盖前面的
void mystrcpy(char *str,char *ptr)
{
    while(*ptr!='')
    {
        *str = *ptr;
        ptr ++;
        str ++;
    }
    *str = *ptr;    
}
//mystrcmp  比较字符串大小  相等返回值为0
int my_strcmp(const char *str,const char *str1)
{
    char *p = (char *)str;
    char *q = (char *)str1;

    while(*p!=''&&*p==*q)
    {
            p++;
            q++;
    }
    if (*p > *q)
	{
		return 1;
	}
	else if (*p < *q)
	{
		return -1;
	}
	else
	{
		return 0;
	}
}

 

//mystrncmp  比较字符串 前n个字符的大小 使用strncmp(目的字符串,源字符串,前n个字符)
int my_strncmp(const char *str,const char *str1,int n)
{
    char *p = (char *)str;
    char *q = (char *)str1;
    while(n--)
    {
        if(*p == *q)
        {
            p++;
            q++;
        }
        else
        {
            return (*p - *q);
        }
    }
    return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1025696.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号