• linux下面实现kbhit函数
• }} if(((k==h[s])&&(i==q[s]))) { if(kbhit()) {if(kbhit()) if(kbhit()) if(kbhit()) if(kbhit()) if(kbhit()) {;}} printf("*"); i++;}} if(i==0||i==y-1) {printf("*");} else {{printf(" ");}}}}} printf("\n");...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include
#include
int main(void)
{int i=0,u=37,p=53,h[50],q[50],y=0,s=1,w=0,o=2, k=0,m=0,a=18,b=25;
char g;
for(s=0;s<8;s++)
{i=i+1;
h[s]=25;
q[s]=i;}
y=p;
h[8]=27;
q[8]=25;
while(1)
{/*控制q[0]与h[0]的数的坐标值，就可以控制蛇头*/
{if(kbhit())
{g=getche();
switch (g){
case 'w':
//h[0]=h[0]-1;
break;
case 's':
//h[0]=h[0]+1;
break;
case 'a':
//q[0]=q[0]-1;
break;
case 'd':
//q[0]=q[0]+1;
break;
}
}
}
if(g=='w')
{h[8]=h[8]-1;}
if(g=='s')
{h[8]=h[8]+1;}
if(g=='a')
{q[8]=q[8]-1;}
if(g=='d')
{q[8]=q[8]+1;}
for(w=0;w<8;w++)
{q[w]=q[w+1];
h[w]=h[w+1];}
//sleep(1);
y=p;
for(k=0;k
{{if(k==0||k==u-1)
{for(i=0;i
{printf("*");}}
else
{for(i=0;i
{for(s=0;s<8;s++)
{if(kbhit())
{if(kbhit())
if(kbhit())
if(kbhit())
if(kbhit())
if(kbhit())
{;}}
if(kbhit())
{if(kbhit())
if(kbhit())
if(kbhit())
if(kbhit())
if(kbhit())
{;}}
if(kbhit())
{if(kbhit())
if(kbhit())
if(kbhit())
if(kbhit())
if(kbhit())
{;}}
if(kbhit())
{if(kbhit())
if(kbhit())
if(kbhit())
if(kbhit())
if(kbhit())
{;}}
if(kbhit())
{if(kbhit())
if(kbhit())
if(kbhit())
if(kbhit())
if(kbhit())
{;}}
if(kbhit())
{if(kbhit())
if(kbhit())
if(kbhit())
if(kbhit())
if(kbhit())
{;}}
if(kbhit())
{if(kbhit())
if(kbhit())
if(kbhit())
if(kbhit())
if(kbhit())
{;}}
if(kbhit())
{if(kbhit())
if(kbhit())
if(kbhit())
if(kbhit())
if(kbhit())
{;}}
if(kbhit())
{if(kbhit())
if(kbhit())
if(kbhit())
if(kbhit())
if(kbhit())
{;}}
if(kbhit())
{if(kbhit())
if(kbhit())
if(kbhit())
if(kbhit())
if(kbhit())
{;}}
if(kbhit())
{if(kbhit())
if(kbhit())
if(kbhit())
if(kbhit())
if(kbhit())
{;}}
if(kbhit())
{if(kbhit())
if(kbhit())
if(kbhit())
if(kbhit())
if(kbhit())
{;}}
if(((k==h[s])&&(i==q[s])))
{
if(kbhit())
{if(kbhit())
if(kbhit())
if(kbhit())
if(kbhit())
if(kbhit())
{;}}
printf("*");
i++;}}
if(i==0||i==y-1)
{printf("*");}
else
{{printf(" ");}}}}}
printf("\n");}}
return 0;}

展开全文
• 在这里，我们将看到C中的kbhit功能。kbhit基本上是Keyboard Hit。此函数位于conio.h头文件中。因此，要使用此文件，我们必须将此头文件包含在我们的代码中。其功能kbhit()是，当按下某个键时，它返回非零值，否则...

在这里，我们将看到C中的kbhit功能。kbhit基本上是Keyboard Hit。此函数位于conio.h头文件中。因此，要使用此文件，我们必须将此头文件包含在我们的代码中。
其功能kbhit()是，当按下某个键时，它返回非零值，否则返回零。
示例#include
#include
main() {
char ch;
printf("Enter keys (ESC to exit)\n");
while (1) { //define infinite loop for taking keys
if (kbhit) {
ch = getch(); // Get typed character into ch
if ((int)ch == 27) //when esc button is pressed, then it will comeout from loop
break;
printf("You have entered : %c\n", ch);
}
}
}
输出结果Enter keys (ESC to exit)
You have entered : i
You have entered : t
You have entered : D
You have entered : w
You have entered : 5
You have entered : /
You have entered : *
You have entered : +
You have entered :
You have entered : o
You have entered :
You have entered : &
注意：这kbhit()不是标准库。因此，我们应该在代码中避免这种情况。

展开全文
• 对于上面的问题，都用到linux下的getch函数与kbhit函数。参考了http://kpld8888.wordpress.com/2007/03/07/linux%E4%B8%8B%E7%9A%84getch%E5%87%BD%E6%95%B0%E4%B8%8Ekbhit%E5%87%BD%E6%95%B0-2/和：...

对于上面的问题，都用到
linux下的getch函数与kbhit函数。
参考了http://kpld8888.wordpress.com/2007/03/07/linux%E4%B8%8B%E7%9A%84getch%E5%87%BD%E6%95%B0%E4%B8%8Ekbhit%E5%87%BD%E6%95%B0-2/
和：http://zhidao.baidu.com/question/461121586.html
但是我照搬上面两条都不能很好的编译，总是有错误。奉上我的文件：
将下列三个文件放在工程目录下，build project即可。
main.c:
#include "kbhit.h"
#include
#include
#include "accelerometer.h" //contains the middle level macros, state variable
// definition and declaration for the
//middle layer (class layer) functions
void delay(int a){
int i,j,delay;
for(i = 0 ; i < 1170*(200/a); i++){
delay = 0;
for(j = 0; j < 100; j++){
delay = delay+1;
}
}
}
int main()
{
float x,y,z; // store x,y,z acceleration
acc_t state;
int i = 0;
int Hz,N;
// initialize using ADXL345 at 50 HZ
printf("Cannot Init \n");
return (-1);
}
// No Auto Sleep1:
if (acc_autosleepSet(&state,NO_AUTOSLEEP) < 0) {
printf("Failed to set AutoSleep condition\n");
}
// No Auto Sleep2:
system("echo 0 > /sys/bus/i2c/devices/0-0053/autosleep");
//--------------Initialize finished. --------------//
printf("input the number of data, Hz: ");
scanf("%d,%d", &N, &Hz);
while(i < N){
if (acc_xyzGet(&state,&x,&y,&z) < 0) { // get acceleration
}
else {
printf("%f,%f,%f\n",x-0.573,y,z); //x correction
}
delay(Hz);
i++;
if( kbhit()>0 ){
break;
}
}
if (acc_Release(&state) < 0) {
printf("Failed to Release Accelerometer Nuggets\n");
return (-1);
}
else{
printf("Accelerometer Released! \n");
}
return 0;
}
/* if (acc_xyzGet(&state,&x,&y,&z) < 0) { // get acceleration
}
else {
printf("Accelerations::: X=%f, Y=%f, Z=%f\n",x,y,z);
}
if (acc_xyzEventGet(&state,&x,&y,&z) < 0) { // get acceleration
printf("Failed to read acceleration values via event get\n");
}
else {
printf("Accelerations::: X=%f, Y=%f, Z=%f\n",x,y,z);
}
if (acc_xyzEventGet(&state,&x,&y,&z) < 0) { // get acceleration
printf("Failed to read acceleration values via event get\n");
}
else {
printf("Accelerations::: X=%f, Y=%f, Z=%f\n",x,y,z);
}
if (acc_freefallEventGet(&state) < 0) {
}
else {
printf ("Freefall!!\n");
}
*/
kbhit.c
/*#include
#include
#include
#include
#include
#include
#include
#include
#include "kbhit.h"
static struct termios initial_settings, new_settings;
static int peek_character = -1;
void init_keyboard()
{
tcgetattr(0,&initial_settings);
new_settings = initial_settings;
new_settings.c_lflag &= ~ICANON;
new_settings.c_lflag &= ~ECHO;
new_settings.c_lflag &= ~ISIG;
new_settings.c_cc[VMIN] = 1;
new_settings.c_cc[VTIME] = 0;
tcsetattr(0, TCSANOW, &new_settings);
}
void close_keyboard()
{
tcsetattr(0, TCSANOW, &initial_settings);
}
int kbhit()
{
unsigned char ch;
if (peek_character != -1) return 1;
new_settings.c_cc[VMIN]=0;
tcsetattr(0, TCSANOW, &new_settings);
new_settings.c_cc[VMIN]=1;
tcsetattr(0, TCSANOW, &new_settings);
{
peek_character = ch;
return 1;
}
return 0;
}
{
char ch;
if(peek_character != -1)
{
ch = peek_character;
peek_character = -1;
return ch;
}
return ch;
}
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include "kbhit.h"
#undef TERMIOSECHO
#define TERMIOSFLUSH
/*
* kbhit() — a keyboard lookahead monitor
*
* returns the number of characters available to read
*/
int kbhit ( void )
{
struct timeval tv;
struct termios old_termios, new_termios;
int error;
int count = 0;
tcgetattr( 0, &old_termios );
new_termios = old_termios;
/*
* raw mode
*/
new_termios.c_lflag &= ~ICANON;
/*
* disable echoing the char as it is typed
*/
new_termios.c_lflag &= ~ECHO;
/*
* minimum chars to wait for
*/
new_termios.c_cc[VMIN] = 1;
/*
* minimum wait time, 1 * 0.10s
*/
new_termios.c_cc[VTIME] = 1;
error = tcsetattr( 0, TCSANOW, &new_termios );
tv.tv_sec = 0;
tv.tv_usec = 100;
/*
* insert a minimal delay
*/
select( 1, NULL, NULL, NULL, &tv );
error += ioctl( 0, FIONREAD, &count );
error += tcsetattr( 0, TCSANOW, &old_termios );
return( error == 0 ? count : -1 );
} /* end of kbhit */
/*————————————————*/
kbhit.h
#ifndef KBHITh
#define KBHITh
void init_keyboard(void);
void close_keyboard(void);
int kbhit(void);
#endif

展开全文
• 编写过MS-DOS程序的人通常都会查找Linux下等同于kbhit的函数，这个函数会检测一个按键是否被按下而并不实际的读取。不幸的是他们并没有找到这样的函数，因为并没有直接等同的函数。Unix程序员并不会注意到这个遗漏，...

编写过MS-DOS程序的人通常都会查找Linux下等同于kbhit的函数，这个函数会检测一个按键是否被按下而并不实际的读取。不幸的是他们并没有找到这样的函数，因为并没有直接等同的函数。Unix程序员并不会注意到这个遗漏，因为Unix的编程方式通常为程序应准备好等待事件的发生。因为这就是通常的kbhit的用法，所以Unix和Linux将其忽略了。
然而，当我们要由MS-DOS移植程序时，通常需要模拟kbhit，此时我们可以用非正规输入模式来做到。
试验－－我们自己的kbhit
1 首先我们需要定义标准的头文件并且为终端设置声明了一个结构。peek_character用于测试一个按键是否被按下。然后我们定义了我们将会用到的函数的原型。
#include
#include
#include
#include
#include
static struct termios initial_settings, new_settings;
static int peek_character = -1;
void init_keyboard();
void close_keyboard();
int kbhit();
2 main函数调用init_keyboard函数来配置终端，然后一秒循环一次，调用kbhit函数。如果按键检测为q，close_keyboard函数会返回正常行为并且退出程序。
int main()
{
int ch = 0;
init_keyboard();
while(ch != 'q') {
printf("looping\n");
sleep(1);
if(kbhit()) {
printf("you hit %c\n",ch);
}
}
close_keyboard();
exit(0);
}
3 init_keyboard与close_keyboard在程序的开始和结束配置终端。
void init_keyboard()
{
tcgetattr(0,&initial_settings);
new_settings = initial_settings;
new_settings.c_lflag &= ~ICANON;
new_settings.c_lflag &= ~ECHO;
new_settings.c_lflag &= ~ISIG;
new_settings.c_cc[VMIN] = 1;
new_settings.c_cc[VTIME] = 0;
tcsetattr(0, TCSANOW, &new_settings);
}
void close_keyboard()
{
tcsetattr(0, TCSANOW, &initial_settings);
}
4 下面是检测键盘按键的函数：
int kbhit()
{
char ch;
if(peek_character != -1)
return 1;
new_settings.c_cc[VMIN]=0;
tcsetattr(0, TCSANOW, &new_settings);
new_settings.c_cc[VMIN]=1;
tcsetattr(0, TCSANOW, &new_settings);
peek_character = ch;
return 1;
}
return 0;
}
{
char ch;
if(peek_character != -1) {
ch = peek_character;
peek_character = -1;
return ch;
}
return ch;
}
当我们运行这个程序时，我们会得到下面的输出：
$./kbhit looping looping looping you hit h looping looping looping you hit d looping you hit q$
工作原理
在init_keyboard中配置终端在返回之前(MIN=1,TIME=0)读取一个字符。kbhit将其改变为检测输入并且立即返回(MIN=0，TIME=0)，然后在程序退出前恢复原始设置。
注意，我们必须读取被按下的键，但是却是在局部存储，从而可以在需要的时候返回。
虚拟控制台
Linux提供了一个称之为虚拟控制台的特性。有许多的终端设备可用，所有的设备都共享PC的屏幕，键盘以及鼠标。通常，一个Linux的安装配置12个这样的虚拟控制台。
虚拟控制台是通过字符设备/dev/ttyN来访问的，在这里N是一个数字，由1开始。
如果我们的Linux系统使用文本登陆，那么在Linux启动运行时我们就会得到一个登陆提示。然后我们可以使用用户名与密码进行登陆。此时我们使用的设备就是第一个虚拟控制台，终端设备/dev/tty1。
使用who与ps命令，我们可以看到登陆的用户，shell与在这个虚拟控制台上正运行的程序：
$who neil tty1 Mar 8 18:27$ ps -e
PID TTY          TIME CMD
1414 tty1     00:00:00 bash
1431 tty1     00:00:00 emacs
从这里我们可以看出登陆的用户为neil，并且在控制台设备/dev/tty1上运行Emacs。
Linux通常启动一个getty进程运行在前六个虚拟控制台上，这样就可以使用相同的屏幕，键盘与鼠标登陆六次。我们可以使用ps看到这些进程：
$ps -e PID TTY TIME CMD 1092 tty1 00:00:00 login 1093 tty2 00:00:00 mingetty 1094 tty3 00:00:00 mingetty 1095 tty4 00:00:00 mingetty 1096 tty5 00:00:00 mingetty 1097 tty6 00:00:00 mingetty 在这里我们可以看到SuSE默认的getty程序，mingetty，运行在另外五个虚拟控制台上，等待用户登陆。 我们可以使用一个特殊的按键组合Ctrl+Alt+F来在虚拟控制台之间进行切换，在这里N为我们要切换到的虚拟控制台号。所以要切换到第2个虚拟控制台，我们需要按下Alt+Ctrl+F2，而Ctrl+Alt+F1会返回到第一个控制台。(当由字符登陆而不是图形登陆切换时，Ctrl+F组合也可以起作用) 如果Linux启动一个图形登陆，或者是通过startx或者是通过一个显示管理器，例如xdm，X Window系统将会使用第一个空闲的虚拟控制台来启动登陆，通常为/dev/tty7。当使用X Window系统时，我们可以使用Ctrl+Alt+F切换到文本控制台，并使用Ctrl+Alt+F7返回到图形控制台。 通常在Linux上会运行多个会活。如果我们这样做，例如，使用命令$ startx - :1
Linux会在下一个空闲的虚拟控制台上启动X服务器，在这种情况下，通常为/dev/tty8，然后我们可以使用Ctrl+Alt+F8与Ctrl+Alt+F7在他们之间进行切换。
在所有其他方面，虚拟控制台的行为与终端类似，正如我们在这一章所描述的。如果一个进程具有正确的权限，虚拟控制台可以使用与通常的终端相的方式执行打开，读取与写入等操作。
伪终端
许类Unix系统，包括Linux，具有一个名为伪终端的特性。这些设备的行为与我们在这一章所使用的终端相类似，所不同的是他们并没有与其相关联的硬件。他们可以用来为其他的程序提供一个类终端接口。
例如，使用两个伪终端就可以使得两个象棋程序彼此交战，尽管程序本身是设置用来与人在终端进行交互的。作为中介的程序将一个程序的动作传递给另一个。可以使得伪终端可以使得程序在不提供终端的情况下像通常一样运行。
伪终端曾经是以特定系统的方式实现的。现在他们已经进入Single Unix规范的Unix98伪终或是PTY标准中。
总结
在这一章，我们了解了控制终端的三个不同方面。在这一章的第一部分，我们了解了重定向检测以及如何与一个终端交互，尽管标准的文件描述符已经进行重定向。我们讨论的硬件模型及其历史。然后我们了解了通用终端接口以及在Linux终端处理上提供详细控制的termios结构。我们也看到了如何使用termios数据库以及以独立于终端的方式管理屏幕的相关函数，同时我们也了解了立即检测按键。最后，我们讨论了Linux虚拟控制台以及伪终端。

展开全文
• 我们知道，在windows下有个键盘测试函数，int kbhit(void)。使用该函数需要包含头文件conio.h。执行时，kbhit测试是否有键盘按键按下，若有则返回非零值，否则返回零。在Unix/Linux下，并没有提供这个函数。在linux...
• 最近写一段程序，因为刚学linux学习网络编程，编个聊天软件(有一个...其中最多的就是各种kbhit()函数在linux中实现，最开始是做的是这样做的：首先，在网上找到了kbhit()函数的实现：int kbhit(void){struct term...
• <code>if (_kbhit()) { xxxxxxx xxxxxxx }</code></pre> 本人碰到问题如上代码段所示，我无法跳出这个if语句了，怎么按键盘_kbhit()的返回值都是1，if永远进行怎么办。</p>
• 满意答案gyhm2013.05.08采纳率：55%等级：12已帮助：5107人函数名: kbhit功 能: 检查当前按下的键用 法: int kbhit(void);程序例:#includeint main(void){cprintf("Press any key to continue:");while (!kbhit()) /...
• 查找资料发现输入检测函数有kbhit（）函数，如果有输入它会返回一个非0值，没有就返回0，修改后的函数如下： 运行程序，它会不停地打印地址和地址的值，直到用户输入字符q。 但是运行结果发现：当地址为0xffff时，...
• 满意答案xioangmen2013.06.08采纳率：41%等级：12已帮助：10789人函数简介函数名：kbhit()(VC++6.0下为_kbhit())功 能及返回值： 检查当前是否有键盘输入，若有则返回一个非0值，否则返回0。当调用kbhit()函数检测后...
• getch()、getche()、kbhit()的使用 函数 作用 是否为标准库函数 头文件 getch() 键盘上读入一个字符，不将读入的字符回显在显示屏幕上 否 conoi.h getche() 键盘上读入一个字符，并将读入的字符回显到显示...
• } int kbhit() { unsigned char ch; int nread; if (peek_character != -1) return 1; new_settings.c_cc[VMIN]=0; tcsetattr(0, TCSANOW, &new_settings); nread = read(0,&ch,1); new_settings.c_cc[VMIN]=1; ...
• 我试图用控制台获得快速时间事件...有没有办法在标准C中替换kbhit()和getch()函数？有什么我可以做得到理想的效果还是应该放弃这个概念？以下是我创建的函数的代码。#include #include #include #include #include ...
• 一、kbhit() 和 getch() C语言中kbhit()函数（conio.h）：检查当前是否有键盘输入，若有则返回一个非0值，否则返回0。 getch()函数，不需要回车就可以得到输入的控制字符； 一般kbhit()和getch() 搭配使用！ 1...
• 在VC++中运行出现errorC2065:'kbhit':undeclaredidentifier，什么意思？怎么调试？0yareate2013.04.08浏览493次分享举报#define N 200#include #include #include #define LEFT 0x4b00#define RIGHT 0x4d00#define ...
• if(kbhit()) { if( getchar() == 'q') { printf("Dodged!\n\n"); ok = 0; break; } else { break; } } } while(elapsed ); if(ok) { printf("You took damage!\n\n"); recieved++; break; } break; case(2): ok = 1...
• 函数名：kbhit()（VC++6.0下为_kbhit()） 功 能及返回值： 检查当前是否有键盘输入，若有则返回一个非0值，否则返回0 用 法：int kbhit(void); 包含头文件： include <conio.h> 程序示例 C语言 #...
• ## kbhit()函数用法

千次阅读 多人点赞 2020-05-26 16:46:45
kbhit()是一个C和C++函数，用于非阻塞地响应键盘输入事件。 函数名：kbhit() 功能及返回值： 检查当前是否有键盘输入，若有则返回一个非0值，否则返回0。 用 法：int kbhit(void); C++语言包含头文件： include <...
• 1 _kbhit()函数与_getch()函数的用法 _khbit()函数和_getch()函数都是在conio.h头文件中定义。 _kbhit()函数(keyboardhit)的作用是用于检查控制台窗口的按键是否被按下。其格式为 int _kbhit(void); 如果在调用该...
• 查找资料发现输入检测函数有kbhit（）函数，如果有输入它会返回一个非0值，没有就返回0，修改后的函数如下： 运行程序，它会不停地打印地址和地址的值，直到用户输入字符q。 但是运行结果发现：当地址为0xffff时，...
• _kbhit() for Linux发布时间:2006-09-18 20:52:57来源:红联作者:ServiceThe Windows _kbhit() function returns a nonzero value when a character is waiting in stdin, otherwise it returns zero. It does not ...
• kbhit(): kbhit用来检测键bai盘是否有按键,有则返回-1,没有则返回0; 函数名：kbhit() 包含头文件： include <conio.h> 在VC++6.0下为_kbhit() 功能及返回值同上； 样例： _getch(): 如果想知道按下了什么键,...
• ## C++中_kbhit()函数与_getch()函数

万次阅读 多人点赞 2019-01-27 18:13:49
int _kbhit( void ); 如果在调用该函数时，有按键被按下，则返回一个非零值，否则该函数的返回值是0。需要注意的是，该函数是一个非阻塞函数，不管有没有按键被按下，该函数都会立即返回。_khbit()函数一般与_...
• kbhit()接口在头文件conio.h（控制台输入输出consoleinput/output）中。 百度百科： conio.h不是C标准库中的头文件，在C standard library，ISO C 和POSIX标准中均没有定义。 conio是Console Input/Output...
• c语言前辈们，怎么用getch()巧妙代替kbhit()的功能？0sammigo2014.10.26浏览18次分享举报这是在能TC上运行的小球动态碰撞的程序，调用了图形函数graphics.h。如何用getch()能达到和用kbhit()一样的效果？#include#...

...