纯C小练习之模拟循环缓冲区
来源:互联网 发布:票务平台知乎 编辑:程序博客网 时间:2024/05/16 05:37
为了巩固一下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);
}
运行结果:
- 纯C小练习之模拟循环缓冲区
- c语言练习 循环结构 缓冲区 逗号表达式
- javascript语法之循环语句小练习
- python之自练习小程序(循环)
- Objective-C实现循环缓冲区
- for循环的小练习之交替输出
- 循环缓冲区的C语言实现
- C语言——循环缓冲区
- 练习之模拟时钟
- C语言之(for循环)模拟用户登录情景
- Boost学习之循环缓冲区--circular_buffer
- C语言小练习
- C小练习
- C 小练习
- c语言小练习
- C编程小练习
- C++“类”小练习
- c语言小练习
- 用户登录安全验证模块代码测试
- linux学习进阶
- 关于Scanf和gets函数的讨论
- 西班牙Suvil 魔指鼠标,挺有个性
- cuda的dll开发流程
- 纯C小练习之模拟循环缓冲区
- umount: device is busy时怎么办?
- Optimizing C and C++ Code
- Hibernate二级缓存
- FAQ_EL表达式在页面中无法使用
- 用户控件 UserControl类
- 转:请警惕“二十九岁现象”!
- mini2440 安装linux后上网设置问题
- The Linux Boot Process