简易通讯录初编

LINUX中清空输入缓冲区最简便的方法
  • #include <stdio_ext.h>
    __fpurge(stdin);

  • rewind(stdin);函数的作用是指向缓冲区的指针指向缓冲区的开头
    fpurpe(stdin);函数的作用是清除缓冲区中所有的作用.

  • 首先,fflush在C/C++/POSIX标准中只定义了处理输出流的行为,对于像stdin这种输入流,这是未定义行为undefined behavior,随便C/C++库怎么去实现都不算错。即使某个C/C++库对fflush(stdin)的处理是删除掉你硬盘上所有文件都没有错。所以你根本不要指望任何未定义行为能在不同平台下有相同的表现。

再来看看linux对fflush(stdin)的说法
代码: man 3 fflush
如果对fflush传入一个输入流,会清除已经从输入流中取出但还没有交给程序的数据

  • fflush处理的是已经从输入流中取出的数据,而不是输入流中剩余的数据。而且这数据还不能交给程序,也就是说,对于getchar这种函数,只有其还未返回时,stdin的输入缓冲区才可能有数据,此时调用fflush才会有用
    代码:man 3 stdin
    和上面连起来看就更明白了,终端驱动中接收你输入文本的缓冲区就相当于是输入流,和stdin的缓冲区是两回事

连输入流都没提到。说明glibc实现中的fflush要么对输入流什么都没干,要么干了些对外部完全没有影响的事
要想实现你所希望的效果,可以用非标准的fpurge()。glibc中的近似实现是__fpurge()。
代码:man 3 fpurge

附录程序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int i = 0; 

/*定义结构体变量*/
struct contact
{
    char name[20];//姓名
    char ismale[20];//性别
    char tel[20];//电话
    char address[20];//住址
    char remark[20];//备注
};

struct contact p[100];   //声明结构体p
void clear();//清屏
void interface();//界面函数,输出主界面
void add();//定义添加联系人函数
void printfcon(int j);//定义打印单个联系人信息函数
void list();//定义联系人列表函数,输出所有联系人信息
int findnum( char *s, int *accumlate );//定义找到联系人编号函数,找到编号存入数组accumlate
void seek();//定义查找函数,通过姓名查找
void coverdata( int j );//定义覆盖信息函数
void delete();//定义删除联系人函数
void modify( int j );//定义修改函数
void revise();//定义修改信息函数

int main()
{
    for( ; ; )
    {
        int temp = 0;
        clear();  //清屏
        interface();    //调用interface函数,输出主界面
        __fpurge(stdin);
        scanf("%d",&temp);

        switch(temp) //switch语句选择功能
        {
            case 1:
                add();
                break;


            case 2:
                list();
                printf("按enter返回主界面!\n");
                __fpurge(stdin);         
                getchar(); 
                break;

            case 3:
                delete();
                break;

            case 4:
                seek();
                printf("按enter返回主界面!\n");
                __fpurge(stdin);
                getchar();
                break;

            case 5:
                revise();
                break;

            case 6:exit(0);

            default:
                printf("输入错误!");
                printf("按enter返回主界面!\n");
                __fpurge(stdin);
                getchar();
                break;
        }
    }

    return 0;
}

void clear()//清屏
{
    system("clear");     
}

void interface()//主界面函数
{
    printf("            * * * * * * * * * * * * * *\n");
    printf("          ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~\n");
    printf("        ~                                ~ \n");
    printf("        |.          通  讯  录          .| \n");
    printf("        .|        $$$$$$$$$$$$$$$$    |. \n");
    printf("        |.          1、添加联系人;     .| \n");
    printf("        .|          2、 查看列表;      |. \n");
    printf("        |.          3、删除联系人;     .| \n");
    printf("        .|          4、查找联系人;     |. \n");
    printf("        |.          5、 修改信息;      .| \n");
    printf("        .|          6、退出程序;       |. \n");
    printf("        |.        $$$$$$$$$$$$$$$$      .| \n");
    printf("        .|                              |. \n");
    printf("        |.       选择编号进行操作吧     .|\n");
    printf("        ~                               ~ \n");
    printf("          ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ \n");
    printf("            * * * * * * * * * * * * * *\n");
}

void add()//定义添加联系人函数
{
    char c = 0;

    do
    {
        clear();

        printf("请输入联系人姓名:"); //录入联系人信息
        scanf("%s",p[i].name);

        printf("请输入联系人性别:");
        scanf("%s",p[i].ismale);

        printf("请输入联系人电话号码:");
        scanf("%s",p[i].tel);

        printf("请输入联系人家庭地址:");
        scanf("%s",p[i].address);

        printf("备注:");
        scanf("%s",p[i].remark);

        i++;     //录完后i++

        printf("是否继续添加? (y/n) :");
        __fpurge(stdin); //清除缓冲区
        c = getchar();

    }
	while( c == 'y' );//do while语句,当c不等于y时退出循环

}

void printfcon(int j) //定义打印单个联系人信息函数
{
    printf("编号:%d\n",j);
    printf("姓名:%s\n",p[j].name);
    printf("性别:%s\n",p[j].ismale);
    printf("电话:%s\n",p[j].tel);
    printf("地址:%s\n",p[j].address);
    printf("备注:%s\n",p[j].remark);
    printf("\n");
}

void list()//定义联系人列表函数,输出所有联系人信息
{
    clear();//清屏

    int j = 0;

    for( j = 0; j < i; j++ )//遍历打印所有联系人
    {
        printfcon( j );
    }
}

int findnum( char *s, int *accumlate )//定义找到联系人编号函数,找到编号存入数组accumlate
{
    int m = 0;
    int j = 0;

    for( m = 0; m < i; m++ )
    {
        if( strcmp( s, p[m].name ) == 0 )
        {
            accumlate[j++] = m;   //比较字符串s和结构体中的name,如果返回值为0,代表相等,把编号存入数组
        }
    }

    return j;  //返回数组中有几个值,即能找到几个联系人
}

void seek()//定义查找函数,通过姓名查找
{
    char c = 0;
    do
    {
        clear();

        int j = 0;
        int temp = 0;
        int accum = 0;
        int a[20] = {0};
        char name[20] = {0};

        printf("请输入你想查找的联系人的姓名:");
        scanf("%s",name);

        accum = findnum( name, a );   //调用findnum函数,并把找到几个联系人赋给accum

        if( accum == 0 )
        {
            printf("此联系人不存在!\n");
        }

        else if( accum == 1 )   //如果找到一个联系人,输出这个联系人的信息
        {
            temp = a[0];
            printfcon( temp );
        }

        else if( accum > 1 )   //找到不止一个联系人,输出全部联系人信息
        {
            printf("有%d个联系人!\n",accum);
            for( j = 0; j < accum; j++ )
            {
                temp = a[j];
                printfcon( temp );
            }
        }
            printf("是否继续查找? (y/n) :");
            __fpurge(stdin);
            c = getchar();

    }while( c == 'y' );
}

void coverdata( int j )//定义覆盖信息函数
{
    int m = 0;

    printf("是否删除该联系人?(y/n)");                   
    __fpurge(stdin);

    if( getchar() == 'y' )
    {
        for( m = j + 1; m < i; m++ )
        {
            strcpy( p[m].name, p[m + 1].name );
            strcpy( p[m].ismale, p[m + 1].ismale );
            strcpy( p[m].tel, p[m + 1].tel );
            strcpy( p[m].address, p[m + 1].address );
            strcpy( p[m].remark, p[m + 1].remark );
        }
        i--;    //将后一个的信息传给前一个
    }
}

void delete()//定义删除联系人函数
{
    char c = 0;
    do
    {
        clear();

        int j = 0;
        int temp = 0;
        int accum = 0;
        int a[20] = {0};
        char name[20] = {0};

        printf("请输入你想删除的联系人的姓名:");
        scanf("%s",name);

        accum = findnum( name, a );                     //调用findnum函数,并把找到几个联系人赋给accum

        if( accum == 0 )
        {
            printf("此联系人不存在!\n");
        }

        else if( accum == 1 )
        {
            temp = a[0];
            coverdata(temp);
        }

        else if( accum > 1 )
        {
            printf("有%d个联系人!\n",accum);         //如果找到不止一个联系人,输出这些联系人信息,让操作者选择要删除的联系人编号
            for( j = 0; j < accum; j++ )
            {
                temp = a[j];
                printfcon(temp);
            }

            printf("请输入要删的人的编号:");
            scanf("%d",&temp);
            coverdata(temp);
        }

        printf("是否继续删除? (y/n) :");
        __fpurge(stdin);
        c = getchar();

    }while( c == 'y' );
}

void modify( int j )//定义修改函数
{
    clear();
    printfcon(j);

    int temp = 0;

    printf("\n");
    printf("1--姓名\n");
    printf("2--性别\n");
    printf("3--电话\n");
    printf("4--住址\n");
    printf("5--备注\n");
    printf("请输入你要修改的项:");
    scanf("%d",&temp);
    printf("\n");

    switch(temp)                                        //用switch语句选择要修改的信息
    {
        case 1:{
                   printf("请输入你要改成的姓名:");
                   scanf("%s",p[j].name);
                   break;
               }

        case 2:{
                   printf("请输入你要改成的性别:");
                   scanf("%s",p[j].ismale);
                   break;
               }

        case 3:{
                   printf("请输入你要改成的电话:");
                   scanf("%s",p[j].tel);
                   break;
               }


        case 4:{
                   printf("请输入你要改成的住址:");
                   scanf("%s",p[j].address);
                   break;
               }

        case 5:{
                   printf("请输入你要改成的备注:");
                   scanf("%s",p[j].remark);
                   break;
               }

        default:printf("输入错误!\n");
    }
}

void revise()//定义修改信息函数
{   
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值