如何利用c++在不按enter键的情况下显示输入的字符
来源:互联网 发布:人民币国际化指数数据 编辑:程序博客网 时间:2024/05/21 08:54
今天是周末,北京的天气越来越热了,偶然在overstackflow上看到这个帖子,不禁回想起学校的点点滴滴,顾翻译如此,如有不当,望批评指正!
Question as follows :
Adam:因为不是经常用到,所以我总是记不住如何实现这个功能。在 C/C++ 中,不用到下一行(输入回车)就从标准输入获得字符最好的方法是什么呢?
另外如果不用把字符敲入屏幕那肯定是最完美的,但我仅仅想不通过敲控制台(Enter)就获得键盘输入。
Some answers:
Best one,来自 Johannes Schaub – litb:
如果只用纯C++的话是不太可能满足可移植性的,因为这很大程度上依赖于所使用的终端,其中终端连接了stdin(通常是行缓冲)。但是你可以使用某些库来完成这个功能:
1.Windows 编译器下可用 conio。使用 _getch() 函数让你不用等待回车输入就能得到字符。我不经常使用Windows开发环境来进行开发,但是我见过我同学仅仅包含头文件 conio.h 就可以使用了。你可以在维基百科找到 conio.h 。上面列出了 getch() ,在 Visual C++ 中声明为 deprecated(不赞成使用的)。
2.Linux开发环境中可以使用 curses,在 Windows 中也可以使用兼容的 curses 实现。相比于 conio 它也有一个 getch() 函数。(可通过 man getch 来查看它的 manpage)。同样你也可以在维基百科中找到 Curses。
如果你打算让你的程序跨平台运行的话,我推荐你使用 curses。然而我相信有一些你能用来关掉行缓冲的函数(我相信那应该叫做“原始模式”,与“加工模式”,详细可以在 man stty 中查看)。Curses 可以在跨平台跨终端的环境中帮你处理好这个。
Sone of codes:
Question as follows :
Adam:因为不是经常用到,所以我总是记不住如何实现这个功能。在 C/C++ 中,不用到下一行(输入回车)就从标准输入获得字符最好的方法是什么呢?
另外如果不用把字符敲入屏幕那肯定是最完美的,但我仅仅想不通过敲控制台(Enter)就获得键盘输入。
Some answers:
Best one,来自 Johannes Schaub – litb:
如果只用纯C++的话是不太可能满足可移植性的,因为这很大程度上依赖于所使用的终端,其中终端连接了stdin(通常是行缓冲)。但是你可以使用某些库来完成这个功能:
1.Windows 编译器下可用 conio。使用 _getch() 函数让你不用等待回车输入就能得到字符。我不经常使用Windows开发环境来进行开发,但是我见过我同学仅仅包含头文件 conio.h 就可以使用了。你可以在维基百科找到 conio.h 。上面列出了 getch() ,在 Visual C++ 中声明为 deprecated(不赞成使用的)。
2.Linux开发环境中可以使用 curses,在 Windows 中也可以使用兼容的 curses 实现。相比于 conio 它也有一个 getch() 函数。(可通过 man getch 来查看它的 manpage)。同样你也可以在维基百科中找到 Curses。
如果你打算让你的程序跨平台运行的话,我推荐你使用 curses。然而我相信有一些你能用来关掉行缓冲的函数(我相信那应该叫做“原始模式”,与“加工模式”,详细可以在 man stty 中查看)。Curses 可以在跨平台跨终端的环境中帮你处理好这个。
Sone of codes:
From Kay:
这段代码使用 kbhit() 检查键盘是否被按下,并用 getch() 获取输入的字符。
#include <conio.h>
if (kbhit()!=0) {
cout<<getch()<<endl;
}
来自Falcon Momot:
在 Linux(或者其他类 UNIX 系统)中可以这样实现:
#include <unistd.h>
#include <termios.h>
char getch() {
char buf = 0;
struct termios old = {0};
if (tcgetattr(0, &old) < 0)
perror("tcsetattr()");
old.c_lflag &= ~ICANON;
old.c_lflag &= ~ECHO;
old.c_cc[VMIN] = 1;
old.c_cc[VTIME] = 0;
if (tcsetattr(0, TCSANOW, &old) < 0)
perror("tcsetattr ICANON");
if (read(0, &buf, 1) < 0)
perror ("read()");
old.c_lflag |= ICANON;
old.c_lflag |= ECHO;
if (tcsetattr(0, TCSADRAIN, &old) < 0)
perror ("tcsetattr ~ICANON");
return (buf);
}
From:http://stackoverflow.com/
31 0
- 如何利用c++在不按enter键的情况下显示输入的字符
- 如何在不知道输入个数的情况下输入多个数子?
- OpenCV 利用滚动条在不缩小的情况下显示大型图片
- 如何让DIV在内容不固定的情况下宽度刚好显示完内容
- 在C#项目中不显示Web引用的情况下如何添加“Web引用”?
- 在必须创建Activity的情况下又如何让Activity不显示
- C语言如何在不定义函数的情况下实现递归
- 在不损失数据的情况下如何扩展C盘
- c——从键盘输入一个整数和输入一个字符(在输入不确定的情况下,去除多余的输入)
- UITextField有高亮字符的情况下如何控制字符输入个数
- 如何在不联网的情况下安装 Silverlight Tools
- 如何在不联网的情况下安装 Silverlight Tools
- 服务器在不联网的情况下如何对时
- 如何在不操作界面的情况下关闭UIPopoverController
- 如何在不装ORACLE的情况下使用PLSQL
- 如何在不跳转的情况下实现用户登录
- 如何在不改SQL的情况下优化数据库
- 在有EditText的界面 默认情况下不获取焦点(不弹出输入框)
- linux下对第三方程序的代码执行效率分析
- opencms默认后缀名修改
- 数据库分库分表(sharding)系列(二) 全局主键生成策略
- ios开发之开发文档 start developing ios app
- 重新教自己学算法之单向链表(九)
- 如何利用c++在不按enter键的情况下显示输入的字符
- android 批量打渠道包
- Linux开始菜单,右键菜单添加
- Linux下用C语言连接MySQL数据库
- 云计算: ERP未来必然趋势
- Android的GridView和ScrollView的嵌套
- .bash_profile和.bashrc的区别(如何设置生效)
- 中缀表达式变成后缀表达式
- const 限定符