在read()之后使用getchar()

在read()之后使用getchar(),c,unix,console,stdout,stdin,C,Unix,Console,Stdout,Stdin,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 */ br

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一样工作。

getchar()
很可能是通过读取远远超过1个字节(通常是整个
管道,或4096个字节)的
read()
实现的。然后,它将一个私有游标保存到该缓冲区,根据需要提取字节

之所以这样做,是因为
read()
与调用它相关联的开销非常大

printf()
,和
fwrite()
(等)出于同样的原因也使用缓冲区(
write()
,有非常大的开销)。对
fflush(stdout)
的调用将转换为对任何已缓冲但未发送到底层IO端口的
write()
调用

最后,您有
\n\r
向后;几乎可以肯定它应该是
\r\n

插入

setbuf( stdout, NULL);
在开始时的某个地方,删除\n.

printf(3)
通过
缓冲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);
}
#包括
#包括
#包括
int directPrintf(常量字符*格式,…)
{
va_列表ap;
字符缓冲区[200];
va_开始(ap,格式);
int n=vsnprintf(缓冲区,缓冲区大小,格式,ap);
va_端(ap);
返回写入(1,缓冲区,n);
}