gpt4 book ai didi

c - 在 linux c 中使用按键打破循环

转载 作者:行者123 更新时间:2023-12-04 09:45:54 24 4
gpt4 key购买 nike

我需要用 C 语言编写一个程序,它将执行如下操作:例如,当我按下“a”时,终端将像这样在无休止的循环中写入该键入的字符:aaaaaaaaaaaaaaaa...直到按下另一个键,例如“b”。最终输出应如下所示:aaaaaaaaabbbbbbq(q 应终止程序)。我的代码在这里:

int main(int argc, char** argv) {

int c;
static struct termios staryTermios, novyTermios;


tcgetattr(STDIN_FILENO, &staryTermios);

novyTermios = staryTermios;
novyTermios.c_lflag &= ~(ICANON);
tcsetattr(STDIN_FILENO, TCSANOW, &novyTermios);
while ((c = getchar()) != 'q') {
putchar(c);
}

tcsetattr( STDIN_FILENO, TCSANOW, &staryTermios);

return 0;
}

这个版本只写一次输入的字符,然后等待下一次按键

最佳答案

要达到你想要的结果,你需要让标准输入成为非阻塞的。您可以通过对您的代码进行这种小改动来做到这一点。它在 Mac OS X 10.7.5 上运行良好。请注意,当没有字符可供读取时,getchar() 会返回 EOF(大多数情况下都是这样;您和我的键入速度都不足以对现代计算机产生影响)。我有点担心,在某些系统上,一旦 getchar() 在没有字符可读时返回 EOF 一次,它可能再也不会返回 EOF 以外的任何内容,但这不是问题适用于 Mac OS X。

#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>

static void err_exit(const char *msg);

int main(void)
{
int c;
int oc = '\0';
struct termios staryTermios, novyTermios;
int oflags, nflags;

if (tcgetattr(STDIN_FILENO, &staryTermios) != 0)
err_exit("tcgetattr() failed");

novyTermios = staryTermios;
novyTermios.c_lflag &= ~(ICANON);
if (tcsetattr(STDIN_FILENO, TCSANOW, &novyTermios) != 0)
err_exit("tcsetattr() failed to set standard input");

oflags = fcntl(STDIN_FILENO, F_GETFL);
if (oflags < 0)
err_exit("fcntl() F_GETFL failed");

nflags = oflags;
nflags |= O_NONBLOCK;
if (fcntl(STDIN_FILENO, F_SETFL, nflags) == -1)
err_exit("fcntl() F_SETFL failed");

while ((c = getchar()) != 'q')
{
if (c != EOF)
oc = c;
if (oc != '\0')
putchar(oc);
}

if (tcsetattr(STDIN_FILENO, TCSANOW, &staryTermios) != 0)
err_exit("tcsetattr() failed to reset standard input");

putchar('\n');
return 0;
}

static void err_exit(const char *msg)
{
fprintf(stderr, "%s\n", msg);
exit(1);
}

关于c - 在 linux c 中使用按键打破循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15310848/

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