简单举例说明一下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; } } }