我正在阅读《 C Primer Plus》这本书,并且遇到了如下代码片段:
#include <stdio.h>
#include <ctype.h>
#define SPACE ' '
int main(void) {
char ch = getchar();
while (ch != '\n')
{
if (isalpha(ch))
putchar(ch + 1); //change other characters
else
putchar(ch);
ch = getchar();
}
putchar(ch); //print the newline
return 0;
}
运行并输出:
$ ./a.out
a c programmer
b d qsphsbnnfs
我假设输入a
时,它将立即输出b。但是,它要等到我敲回车。
第二个putchar(ch)似乎正常工作。
putchar(n+1)
不像第二个putchar(ch)那样立即将其放入char的原因是什么?
答案 0 :(得分:2)
假设我输入a,它将立即输出b。但是,它要等到我按Enter键。
“ a,...立即输出b”->不太可能。
putchar(n + 1)不像第二个putchar(ch)那样立即将其放入char的原因是什么?
输入缓冲是第一个可能的问题,因为stdin
通常是行缓冲 。
通常,stdin
甚至在输入(kbd)Enter 或'\n'
之前,一行的前几个字符都不可用。
使用行缓冲输入,在第一次"a c programmer\n"
调用返回getchar()
之前,键入整个'a'
并回显。
除了这种常见情况外,还有其他可能性,因为这是实现的定义。
也可能发生输出缓冲,但这是在输入并回显所有第一行的输入之后发生的事情。因此,当执行putchar('b'), putchar(' '), ...
时,直到putchar('\n')
都看不到输出。参见What are the rules of automatic flushing stdout buffer in C?
答案 1 :(得分:-1)
输出缓冲。 C库stdio具有换行符的缓冲区具有输出缓冲。禁用缓冲调用setbuf(stdout, NULL);