getch在linux下的实现,以及替代的方法

jackxiang 2010-6-26 21:11 | |
#include<stdio.h>
#include<conio.h>
int main()
{
char key;
printf("press a key");
key=getch();
printf("you press %c",key);
return 0;
}
在TC中,先显示“press a key",你按个键后,显示”you press“,再显示你按的那个键。
对应在linux中的C语言要如何写呢?
我是这样写的但是结果是只输出了“you press"再输出你按的那个键。我要如何修改呢?
#include<stdio.h>
#include<curses.h>
int main()
{ printf("press a key");
fflush(stdout);
        char key;
        initscr();
        key = getch();
        endwin();
        printf("you press %c",key);
return 0;
}
问题补充:这位高手所说的system("pause"); 请问是不是暂停屏幕用的,就像TC中在调试时常用getch()来暂停屏幕看输出,但我用getch()是想不按回车键在键盘上捕获所按的键,目前只是显示出这个按键,日后要做成一按这个键不用按回车就立马去执行一些操作,我不是要简单的暂停,不过很感激你提供了暂停的另一种方法。谢谢!但我的问题还没有解决。
getchar()要按一下回车程序才读取输入,能不能不按回车,只要一按键,程序马上做出反应。
getchar()经过我试验后发现不行,达不到我要的效果,请高手们再帮帮忙。谢谢!

原因:
getch()和getche()不是标准C函数,是TC专用的。。。
你可以试试system("pause");
记住包含#include <stdlib.h>


模式实现如下:

在windows下可以通过#include <conio.h>使用getch(),但是conio.h并不是一个标准的头文件,conio也不是标准的c库。所以如果在Linux下的c程序中#include <conio.h>,编程就会报错: No Such file or directory!

那么如果想在Linux下使用与getch() 功能相同的函数,怎么办呢?我们可以通过以下的程序模拟实现getch()。


#include <termios.h>
/* for tcxxxattr, ECHO, etc */
#include <unistd.h>  
/* for STDIN_FILENO *//*simulate windows' getch(), it works!!*/
int getch (void){  
int ch;    struct termios oldt, newt;// get terminal input's attribute  
tcgetattr(STDIN_FILENO, &oldt);    
newt = oldt;    //set termios' local mode    
newt.c_lflag &= ~(ECHO|ICANON);    
tcsetattr(STDIN_FILENO, TCSANOW, &newt);    //read character from terminal input    
ch = getchar();    //recover terminal's attribute    
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);      
return ch;
}


当然你也可以参考CSDN的:
http://download.csdn.net/source/1957263


作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/3253/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2010-6-26 21:12
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]