gpt4 book ai didi

c - 在 read() 之后使用 getchar()

转载 作者:行者123 更新时间:2023-12-02 00:43:52 30 4
gpt4 key购买 nike

c 用于键盘捕获。以下代码查找何时按下箭头键/esc。同时,我想阅读用户输入的整个单词,这些单词也应该显示在 stdout 上。

char pp = 0;
char p = 0;
while( (i = read(0, &c, 1)) == 1) {
if (pp == 033 && p == 0133 && (c &= 255) == 0102) /* DOWN */ break;
if (c == 0177) /* ASCII DELETE */ break;
printf( "%o, %o, %o\t%s\n\r", pp, p, c, &c);
pp = p;
p = c;
}
...
...
getchar(); //I want to capture here what was entered before
// **return key** was pressed.

但是如果我删除'\n',这段代码就不起作用了。我希望 stdout 应该像普通 shell 一样工作。

最佳答案

printf(3)通过 <stdio.h>缓冲 I/O 设施,其中包括 fputs(3)fputc(3) .您正在观察正常的线路缓冲行为。您可以取消此缓冲,如 setbuf(3) 所述,但是,由于您首先不想要它,并且您已经在使用直接内核调用( read(2) )进行读取,为什么不稍微更改您的逻辑以使用 write(2) 直接调用内核呢?还有吗?

char buffer[100];

int n;

n = snprintf(buffer, sizeof buffer, "format string...", args...);
write(1, buffer, n)

如果您愿意,您可以定义自己的 directPrintf 以简化此操作:

#include <stdio.h>
#include <stdarg.h>
#include <unistd.h>

int directPrintf(const char *format, ...)
{
va_list ap;
char buffer[200];

va_start(ap, format);
int n = vsnprintf(buffer, sizeof buffer, format, ap);
va_end(ap);
return write(1, buffer, n);
}

关于c - 在 read() 之后使用 getchar(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1514257/

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