gpt4 book ai didi

c - 如何通过从键盘获取任何值来打破 linux 上 C 中的 while 循环?

转载 作者:IT王子 更新时间:2023-10-29 01:19:35 25 4
gpt4 key购买 nike

我正在构建的程序在一个无限的 while 循环中运行,其中有一个 switch case。我想在每种情况下插入一个 while 循环并在循环中执行一些操作,但是一旦给出键盘输入,循环就应该退出。因此,在从键盘获取输入后,另一个 case 会运行,其中包含嵌套的 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() 可能在没有可用 key 时返回 0 或 -1)

关于c - 如何通过从键盘获取任何值来打破 linux 上 C 中的 while 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16937358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com