为了巩固一下C语言基础,写了几个小程序。下面这个小程序实现了一个循环缓冲区,击键盘的“I”键,一个键盘事件被写入缓冲区;敲击“O”键,代表一个键盘事件从缓冲区被读出。以下是代码:
#include <stdio.h>
#include <stdlib.h>
#define BUTTOM_BUFF_SIZE 8
#define KEY_EVENT 'e'
typedef unsigned char u8;
typedef struct{
u8 buff[BUTTOM_BUFF_SIZE];
u8 head,tail;
}buttom_dev_t;
static buttom_dev_t btm_dev;
static void event_in_buff()
{
btm_dev.buff[btm_dev.head]= KEY_EVENT; //数据写进循环缓存区 %BUTTOM_BUFF_SIZE
btm_dev.head = (++btm_dev.head)%BUTTOM_BUFF_SIZE;
if(btm_dev.head == btm_dev.tail){
btm_dev.tail = (++btm_dev.tail)%BUTTOM_BUFF_SIZE;
}
}
static u8 event_out_buff()
{
u8 ret;
if(btm_dev.head==btm_dev.tail){
return 0;
}
ret = btm_dev.buff[btm_dev.tail];
btm_dev.buff[btm_dev.tail++]=' '; //模拟数据被取走,打印出来为空!
if(btm_dev.tail == BUTTOM_BUFF_SIZE){
btm_dev.tail &= BUTTOM_BUFF_SIZE-1;
}
return ret;
}
void show()
{
int i;
int n;
char flag;
int head=(int)btm_dev.head;
int tail=(int)btm_dev.tail;
//line 1 打印缓冲区数据
for(i=0;i<BUTTOM_BUFF_SIZE;i++){
printf(" %c ",(char)btm_dev.buff[i]);
}
printf("/n");
//line 2 打印读写指针的位置
if(tail>head){
for(i=0;i<head;i++) //space before 'w'
printf(" ");
printf(" w ");
for(i=0;i<tail-head-1;i++)
printf(" ");
printf(" r ");
}
else if(tail<head){
for(i=0;i<tail;i++) //space
printf(" ");
printf(" r ");
for(i=0;i<head-tail-1;i++)
printf(" ");
printf(" w ");
}
else{
for(i=0;i<head;i++)
printf(" ");
printf(" b ");
}
// 打印head,tail的数值
printf("/n");
printf("h=%d/tt=%d/n",btm_dev.head,btm_dev.tail);
}
int main()
{
int i;
char c;
btm_dev.head = btm_dev.tail = 0;
printf("****************************************************/n");
printf("* */n");
printf("* Hit Key I --- An event IN buff */n");
printf("* Hit Key O --- An event OUT buff */n");
printf("* Hit Key Q --- Quit */n");
printf("* Any Key Else --- No event */n");
printf("* */n");
printf("****************************************************/n");
while(1){
c = getch();
if(c=='i'){
printf("/n===================An event IN buff!================/n");
event_in_buff();
show();
}
else if (c=='o'){
printf("/n===================An event OUT buff!===============/n");
event_out_buff();
show();
}
else if(c=='q'){
printf("/n*** exit ***/n");
break;
}
else
printf("/n=======================No event!====================/n");
}
exit(0);
}
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/7c1b7c92b5bc4ee279ca2a5b56f67b2f.jpeg)