关于while( (c = getchar()) != EOF )请问

关于while( (c = getchar()) != EOF )请教
  最近在看K&R的书 但是对while( (c = getchar()) != EOF )还是不是很懂
例如
while( (c = getchar()) != EOF )
{
      purchar(c);
}当输入abc的时候为什么会输出abc   getchar和putchar不是都是对单个字符进行操作的吗?
getchar函数在内部到底是怎么去做的??   还有输入缓冲区到底是什么?是不是还有一个什么键盘的缓冲区??

------解决方案--------------------
引用:
最近在看K&R的书 但是对while( (c = getchar()) != EOF )还是不是很懂
例如
while( (c = getchar()) != EOF )
{
  purchar(c);
}当输入abc的时候为什么会输出abc getchar和putchar不是都是对单个字符进行操作的吗?
getchar函数在内部到底是怎么去做的?? 还有输入缓冲区到底是什么?……

getchar是标准I/O函数,他们是带有缓冲区的,在这些函数的内部会使用“系统调用”来接受数据。在碰到回车时,这个函数才返回,此时你从键盘上输入的字符已经全部在它内部的缓冲区中了。注意你返回的只是一个字符,这个字符也就是你输入的第一个字符,缓冲区的第一个。然后你再次调用getchar(),它会判断缓冲区中是否已有数据,如果有数据就读取缓冲区的第一个字符,然后返回。这样依次下去,直到缓冲区为空,才会等待你输入数据。这就是为什么你输入abc会打印abc而不是



。解释完毕


------解决方案--------------------
引用:
已经验证 但是还有一点不是很明白 
如果是c = getchar();
putchar(c);
putchar(c);
为什么不论我输入的是什么  都是输出两次第一个字符
例如输入abc 输出时aa 为什么不是ab?难道是因为没有循环?

因为c保存的就是abc的第一个字符,即,c的值一直就是a,因此调用一次putchar(c)就输出一个a