我需要用C语言编写一个程序,它会做这样的事情: 例如,当我按下“a”时,终端将在无限循环中写入该类型字符,如下所示:aaaaaaaaaaaaaaa ...直到另一个键,例如“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;
}
这个版本只写入一次键入的字符,然后等待另一个按键
答案 0 :(得分:2)
要获得所需的结果,您需要使标准输入无阻塞。您可以通过对代码的这种微小修改来实现这一点。它在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);
}
答案 1 :(得分:0)
我猜你需要两个线程来访问一个公共变量。一个线程的工作是连续打印公共变量。第二个工作是等待键盘输入并相应地更新变量。