在连续调用期间,STDIN缓冲区和getchar()指针如何变化?

时间:2014-07-27 15:13:18

标签: c stdin getchar

给定stdin缓冲区中的输入,当执行对getchar()的连续调用时,指针是否沿着stdin缓冲区的内存地址移动,允许getchar()检索每个地址的值?如果是这样,一旦检索到它们,删除的值然后指针会递增吗?

一般来说,我对循环中getchar()的理解遵循以下逻辑:

  1. getchar()名为
  2. stdin缓冲区检查输入
  3. 如果stdin缓冲区为空,则getchar()会休眠
  4. 用户输入输入并唤醒获取char()
  5. 再次检查
  6. stdin缓冲区输入
  7. stdin buffer not empty
  8. getchar()在stdin缓冲区开头的地址处检索值
  9. 从stdin缓冲区中删除的地址的值,指针递增
  10. 后续调用重复步骤7-8,直到遇到EOF
  11. 之前在stackoverflow上提出了类似的问题,但我无法理解答案。

1 个答案:

答案 0 :(得分:2)

通常有一个stdio内部缓冲区。 getchar()可以触发一行读入缓冲区,通常在后续调用中,它只是递增一个指针,直到指针到达缓冲区中当前数据的末尾。该实现通常使用一个简单的内部char *到一个底层的动态内存块,带有一些指针和状态变量。

实现方式各不相同,我不记得POSIX标准通常暗示了getchar()或stdio流的内部实现,除了应该支持给定的操作。

如果我记得,有些实现是无缓冲的(我认为我使用的DOS编译器没有缓冲),但是给定的操作系统有多种标准的lib实现。

在同一系统上拥有2个stdio库并不罕见,例如:管理AIX,Solaris,HPUX和其他非Linux / BSD UNIX平台的sys-admin将经常安装GNU堆栈以获取gcc等工具,并且该堆栈包含glibc(GNU LIBC)。

您可以在线下载libc / stdio源代码。见glibc。

如果有帮助,请考虑stdio提供peek和unget功能,唯一的方法是通过终端和用户程序之间的内部缓冲区。