如何通过从键盘获取任何值来打破Linux上的C循环?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何通过从键盘获取任何值来打破Linux上的C循环?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1836字,纯文字阅读大概需要3分钟。
内容图文
![如何通过从键盘获取任何值来打破Linux上的C循环?](/upload/InfoBanner/zyjiaocheng/971/9fc4d6141c134592b582cf8eac663750.jpg)
我正在构建的程序在无限循环中运行,其中包含一个开关盒.我想在每种情况下插入一个while循环并在循环中执行一些操作,但是一旦给出键盘输入,循环就应该退出.因此,在从键盘获取输入之后,另一个案例在其中嵌套了while循环,并且该过程继续.
结构是:
while()//infinite loop
{
............... //operations
............... //operations
switch()
{
case 1:
............... //operations
............... //operations
while()//infinite loop
{
..............
..............
exit if there is any input from keyboard
}
break;
case 2:
............... //operations
............... //operations
while()//infinite loop
{
..............
..............
exit if there is any input from keyboard
}
break;
case n:
............... //operations
............... //operations
while()//infinite loop
{
..............
..............
exit if there is any input from keyboard
}
break;
}
}
有什么办法吗???
解决方法:
Linux键盘输入是缓冲的,为了捕获动态命中的密钥,您必须配置TERM IO.
在main()顶部附近添加一个调用(参见下面的代码)
term_nonblocking();
读取即时按下的键,而不等待回车(CR).
码:
struct termios stdin_orig; // Structure to save parameters
void term_reset() {
tcsetattr(STDIN_FILENO,TCSANOW,&stdin_orig);
tcsetattr(STDIN_FILENO,TCSAFLUSH,&stdin_orig);
}
void term_nonblocking() {
struct termios newt;
tcgetattr(STDIN_FILENO, &stdin_orig);
fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK); // non-blocking
newt = stdin_orig;
newt.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
atexit(term_reset);
}
注意:当程序退出时,将自动调用term_reset()(重置终端参数).
您可以在程序中的任何位置调用现在非阻塞的getchar()来检测按键
int i = getchar();
并检查是否按下了某个键:
if (i > 0) {
// key was pressed, code in `i`
}
在您的程序中,例如:
int key = 0;
while (... && key <= 0) {
// ...
key = getchar();
}
注意:如果您希望输出无缓冲,请调用setbuf(stdout,NULL);
(来自@stacey的注释:当没有密钥可用时,getchar()可能返回0或-1)
内容总结
以上是互联网集市为您收集整理的如何通过从键盘获取任何值来打破Linux上的C循环?全部内容,希望文章能够帮你解决如何通过从键盘获取任何值来打破Linux上的C循环?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。