putchar(ch +1)没有立即放入char

时间:2018-10-16 01:41:36

标签: c

我正在阅读《 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的原因是什么?

2 个答案:

答案 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);