给定stdin缓冲区中的输入,当执行对getchar()的连续调用时,指针是否沿着stdin缓冲区的内存地址移动,允许getchar()检索每个地址的值?如果是这样,一旦检索到它们,删除的值然后指针会递增吗?
一般来说,我对循环中getchar()的理解遵循以下逻辑:
之前在stackoverflow上提出了类似的问题,但我无法理解答案。
答案 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功能,唯一的方法是通过终端和用户程序之间的内部缓冲区。