简单举例说明一下C语言的缓冲区

简单举例说明一下C语言的缓冲区

通常情况下,我们通过键盘输入的字符并不会直接到某个变量的内存中,而是先经过缓冲区再到这个变量的内存中。由于缓冲区的存在,有很多莫名其妙的输入输出的问题。接下来我会以这个通讯录程序举例说明。这个通讯录程序主要处理的内容就是输入和输出的各种字符串。在输入完一个字符串之后,如果想再输入一个字符串,前一次残留在缓冲区的字符或字符串会干扰新的字符串,导致读取的数据错误。我们可以用语句 scanf(“%*c”); 来去除不需要的字符,在读完一个字符串后,紧接着用 scanf(“%*c”); 去接收缓冲区残留的\n符号,从而避免输入缓冲区的问题。以下是我的代码,仅供参考。其中的getch.h头文件是我自己定义并实现的,目的是接收按下一个按键的对应的字符。

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

char name[50][20]={0};
char sex[50]={0};
char phone[50][12]={0};

void anykey_continue(){
    puts("按任意键继续...");
    scanf("%*[^\n]");
    getch();
}

void msg_show(const char *msg,float sec){
    printf("%s",msg);
    fflush(stdout);
    usleep(sec*1000000);
}


void add_contact(){
    printf("请输入姓名,性别,手机号:");
    
    for(int i=0;i<50;i++){
        if(sex[i]=='\0'){
            scanf("%s %c %s",name[i],&sex[i],phone[i]);
            scanf("%*c");
            msg_show("成功添加联系人\n",1.5);
            return ;
            }
        }
        printf("system update\n");
        return ;
}

void del_contact(){
    printf("请输入要删除的联系人的姓名\n");
    char temp[20];
    scanf("%s",temp);
    scanf("%*c");
    for(int i=0;i<50;i++){
        char *p=strstr(name[i],temp);
        if(p){
            sex[i]='\0';
            msg_show("删除成功\n",1.5);
            return ;
        }
    }
    msg_show("删除失败\n",1.5);
    return ;
}

void find_contact(){
    printf("请输入要查找的联系人姓名\n");
    char temp[20];
    scanf("%s",temp);
    scanf("%*c");
    for(int i=0;i<50;i++){
        char *p=strstr(name[i],temp);
        if(p){
            printf("%s %s %s\n",name[i],('w'==sex[i]||'W'==sex[i])?"女":"男",phone[i]);
            msg_show("找到该联系人\n",1.5);
            return ;
        }
    }
    msg_show("没找到\n",1.5);
    return ;
}


void mod_contact(){
    printf("请输入要修改的联系人的姓名:");
    char temp[40];
    scanf("%s",temp);
    scanf("%*c");
    int i=0;
    for(i=0;i<50;i++){
        char *p=strstr(name[i],temp);
        if(!p){
            printf("没有这个人,退出\n");
            return ;
        }
        else break;
    }
    printf("请输入修改后的手机号码:");
    scanf("%s",temp);
    scanf("%*c");
    strcpy(phone[i],temp);
    printf("修改成功\n");
    return ;
}

void show_contact(){
    for(int i=0;i<50;i++)
        if(sex[i])printf("%s %s %s\n",name[i],('w'==sex[i]||'W'==sex[i])?"女":"男",phone[i]);
        anykey_continue();
}

int main(int argc,const char* argv[])
{
    for(;;)
    {
        system("clear");
        puts("1、添加联系人");	
        puts("2、删除联系人");	
        puts("3、修改联系人");	
        puts("4、查询联系人");	
        puts("5、显示所有联系人");	
        puts("6、退出系统");	
        printf("请输入指令:");
        int cmd=getch();
        printf("%c\n",cmd);
        switch(cmd)
        {
            case 49:	add_contact();	break;	
            case 50:	del_contact();	break;	
            case 51:	mod_contact();	break;	
            case 52:	find_contact(); break;	
            case 53:	show_contact();  break;	
            case 54:	return 0;	
        }
    }
}

 

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注