#include<stdio.h>
main()
{
char c;
c=getchar();
putchar(c);
c=getchar();
putchar(c);
c=getchar();
putchar(c);
c=getchar();
putchar(c);
c=getchar();
putchar(c);
}
我的第一个问题是,每当我们使用 getchar()时,它会在内存中的某处创建一个缓冲区,当我们按下 getchar()开始从缓冲区读取内容时< strong> getchar()一次只读一个字符。所以在上面的程序中,当第一个 getchar()执行时,它会在内存中创建一个缓冲区,整行内容将存储在缓冲区中,假设我在输入 getchar()时写“vik” 开始从缓冲区读取内容,然后'v'将分配给变量c,然后只有'v'将从缓冲区刷新,因为 getchar()一次只读取单个字符。然后在下一个语句中 putchar(c)在屏幕上打印'v'。所以现在“ik”留在缓冲区中,当第二个 getchar()语句执行时它不会再要求用户写一些东西,因为除非并且直到缓冲区不会完全冲洗它不会再向用户询问从缓冲区写一些东西而不是它的读取内容所以这里“ik”仍然保留在黄油中,所以在第二个 getchar()语句中从缓冲区读取'i'然后再次'i'将从缓冲区刷新并且 putchar(c)打印'我'。现在'k'留在缓冲区中,当第3个 getchar()执行它从缓冲区读取'k'并向c求助然后'k'也从缓冲区刷新。此时缓冲区完全刷新,当第4个 getchar()执行其要求用户写入内容时,缓冲区中没有内容,因为缓冲区中没有内容,所以让我假设我写“as”并点击进入。 现在我的主要问题是当我给出两个内容“as”并且有两个getchar()和putchar(c)被执行时为什么只有'a'会在屏幕上打印为什么不是's'还?
和, 我的第二个问题是,如果我们说当我们使用 getchar()时,它会在内存中创建一个缓冲区 所以如果我们使用 fflush(stdin),它必须刷新缓冲区。所以根据上面的程序,当我在第一个 putchar(c)之后写 fflush(stdin)而不是刷新缓冲区时,执行和打印相同的输出为什么?
答案 0 :(得分:4)
。现在缓冲区已完全刷新,当第4个getchar()执行其要求用户写入内容时,缓冲区中没有内容,因为缓冲区中没有内容,所以让我假设我写“as”并命中输入。现在我的主要问题是,当我给出两个内容“as”并且有两个getchar()和putchar(c)被执行时,为什么只有'a'会在屏幕上打印为什么不是's'呢?
没有。缓冲区中有\n
。这就是为什么您只输入a
来输入as
。
而且,我的第二个问题是,如果我们说当我们使用getchar()时它会在内存中创建一个缓冲区,所以如果我们使用fflush(stdin),它必须刷新缓冲区。所以按照上面的程序,当我在第一个putchar(c)之后写fflush(stdin)而不是刷新缓冲区时它执行并打印相同的输出如上程序为什么?
fflush(stdin)
将调用未定义的行为(通过ANSI C标准)。你会得到任何东西。你不幸的是它打印出相同的输出。
答案 1 :(得分:2)
因为vik
之后的新行仍在缓冲区中。因此第四个getchar()
将处理新行。
fflush(stdin)
不是标准C,所以未定义的行为,但有些编译器支持它作为扩展。
请注意,您应声明int c
,否则您将无法正确处理EOF
。你也应该检查EOF
。 getchar()
的原型是:
int getchar(void);