只要在Windows下用过C/C++就会很熟悉conio.h
库中的一个函数getch()
,它能够绕过终端输入缓冲区直接从键盘读取一个字符,而且不在界面上显示。html
但若是想直接在Linux环境下用是不行的,由于没有conio.h
库的支持。函数
博主翻了网上的一些资料,在这里给出一个比较简明的实现,使用起来与Windows下没什么差别。字体
#include<cstdio> #include<cstdlib> inline char getch(){ static char ch; system("stty -icanon -echo"); scanf("%c",&ch); system("stty icanon echo"); return ch; }
不知道你们有没有遇到这样的问题:平时所见的输入语句都须要等待咱们输入完才会执行完成,什么都不作的话就会一直阻塞在那里。但咱们有时想让程序在尝试接收读入失败的时候可以继续执行下去。这样要怎么实现呢?code
咱们须要一个函数fcntl
,包含在fcntl.h
中。使用它能够取消输入阻塞。关于它的更详细的内容能够百度。htm
咱们还须要一个函数read
,包含在unistd.h
中,是一个底层的输入函数。blog
定义一个CustomGetch
类,包含构造函数、析构函数和运算符()
重载,再定义一个该类变量getch
,用起来就像函数同样。get
#include<cstdlib> #include<fcntl.h> #include<unistd.h> class CustomGetch{ public: CustomGetch(){ fcntl(0,F_SETFL,O_NONBLOCK); system("stty -icanon -echo"); } ~CustomGetch(){ fcntl(0,F_SETFL,0); system("stty icanon echo"); } inline char operator()(){ static char ch; return ~read(0,&ch,1)?ch:EOF; } }getch;
这样写有一个局限性:在这个变量的生存周期内,不能和其它的输入方式兼容。所以有两种处理方案:博客
getch()
而不须要其它输入方式的语句块内定义临时变量。getch()
同样写成函数。但考虑到实际应用中要频繁调用这个函数对输入流进行检查,而system
操做至关耗时,因此不推荐这样作。由于system("clear")
是个假的清屏,因此咱们须要更好的实现。io
printf("\033c");
对,没了,就一行。class
程序示例
#include<cstdio> #include<cstdlib> int main(){ for(int i=0;;++i){ printf("\033c"); for(int j=0;j<4;++j)puts(1&i?"abcdefg":"abcbefg"); system("sleep 1"); } return 0; }
Linux终端有专门的转义字符。看这个博客