爲了鞏固一下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);
}
運行結果: